如果需要傳遞多個參數,可以將多個參數封裝成一個對象進行傳遞。命令用 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 的時候,可以硬編碼傳遞一個參數,讓它分別執行不同的功能。