如果需要传递多个参数,可以将多个参数封装成一个对象进行传递。命令用 RelayCommand<T>
泛型。
▲ 点击“传递按钮”,将左边的 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 的时候,可以硬编码传递一个参数,让它分别执行不同的功能。