0
点赞
收藏
分享

微信扫一扫

WPF 命令动态传递参数

如果需要传递多个参数,可以将多个参数封装成一个对象进行传递。命令用 ​​RelayCommand<T>​​泛型。

WPF 命令动态传递参数_C#

WPF 命令动态传递参数_硬编码_02

▲ 点击“传递按钮”,将左边的 TextBox 内容传递到右边 TextBlock 中去。

XAML:

<Window.DataContext>
<local:MainVM/>
</Window.DataContext>

<Grid>

<Grid.Resources>
<local:UserInfoConvert x:Key="uic" />
</Grid.Resources>

<StackPanel Margin="10,0,0,50">
<TextBlock Text="动态参数传递" FontWeight="Bold" FontSize="12" Margin="0,5,0,5" ></TextBlock>
<StackPanel Orientation="Horizontal" >
<StackPanel Orientation="Vertical" Margin="0,0,10,0" >
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="姓名" Width="80" ></TextBlock>
<TextBox x:Name="txtUName" Width="200" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="电话" Width="80" ></TextBlock>
<TextBox x:Name="txtUPhone" Width="200" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="地址" Width="80"></TextBlock>
<TextBox x:Name="txtUAdd" Width="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="性别" Width="80" ></TextBlock>
<TextBox x:Name="txtUSex" Width="200" />
</StackPanel>
</StackPanel>

<StackPanel>
<Button Content="点击传递" Command="{Binding DynamicParamCmd}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource uic}">
<Binding ElementName="txtUName" Path="Text"/>
<Binding ElementName="txtUSex" Path="Text"/>
<Binding ElementName="txtUPhone" Path="Text"/>
<Binding ElementName="txtUAdd" Path="Text"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</StackPanel>

<StackPanel Width="240" Orientation="Vertical" Margin="10,0,0,0" >
<TextBlock Text="{Binding ArgsTo.UserName,StringFormat='姓名:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserPhone,StringFormat='电话:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserAdd,StringFormat='地址:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserSex,StringFormat='性别:\{0\}'}" ></TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
</Grid>

Model:

public class UserParam : ObservableObject
{
private string _userName;
public String UserName
{
get
{
return _userName;
}
set
{
_userName = value;
RaisePropertyChanged(nameof(UserName));
}
}

private string _userPhone;
public String UserPhone
{
get
{
return _userPhone;
}
set
{
_userPhone = value;
RaisePropertyChanged(nameof(UserPhone));
}
}

private string _userAdd;
public String UserAdd
{
get { return _userAdd; }
set
{
_userAdd = value;
RaisePropertyChanged(nameof(UserAdd));
}
}

private string _userSex;
public String UserSex
{
get { return _userSex; }
set { _userSex = value; RaisePropertyChanged(nameof(UserSex)); }
}
}

Convert:

public class UserInfoConvert : IMultiValueConverter
{
/// <summary>
/// 对象转换
/// </summary>
/// <param name="values">所绑定的源的值</param>
/// <param name="targetType">目标的类型</param>
/// <param name="parameter">绑定时所传递的参数</param>
/// <param name="culture"><系统语言等信息</param>
/// <returns></returns>
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!values.Cast<string>().Any(text => string.IsNullOrEmpty(text)) && values.Count() == 4)
{
UserParam up = new UserParam() { UserName = values[0].ToString(), UserSex = values[1].ToString(), UserPhone = values[2].ToString(), UserAdd = values[3].ToString() };
return up;
}

return null;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

ViewModel:

public class MainVM : ViewModelBase
{
#region 动态参数传递

private UserParam argsTo;
/// <summary>
/// 动态参数传递
/// </summary>
public UserParam ArgsTo
{
get { return argsTo; }
set { argsTo = value; RaisePropertyChanged(() => ArgsTo); }
}

#endregion
//=================================================================================================================
private RelayCommand<UserParam> dynamicParamCmd;
/// <summary>
/// 动态参数传递
/// </summary>
public RelayCommand<UserParam> DynamicParamCmd
{
get
{
if (dynamicParamCmd == null)
dynamicParamCmd = new RelayCommand<UserParam>(p => ExecuteDynPar(p));
return dynamicParamCmd;
}
set
{

dynamicParamCmd = value;
}
}

private void ExecuteDynPar(UserParam up)
{
ArgsTo = up;
}
}

这种方式应该是用的不多的,因为使用绑定会自动更新了。在多个页面对应一个 ViewModel 的时候,可以硬编码传递一个参数,让它分别执行不同的功能。




举报

相关推荐

0 条评论