在按钮上传递两个命令参数单击 WPF NET 3.5 MVVM
Passing two command parameters on button click on WPF NET 3.5 MVVM
我正在尝试将按钮单击时的两个 ICommand 参数传递给视图模型中的方法。
现在我只能传递一个参数了。
代码在这里。
XAML(查看):
<Button x:Name="btnAdd" Command="{Binding AddUserCommand}"
CommandParameter="{Binding IDUser}"/>
查看模型:
public string IDUser
{
get
{
return this.personalData.UserID;
}
set
{
if (this.personalData.UserID == value)
{
return;
}
this.personalData.UserID = value;
OnPropertyChanged("UserID");
}
}
private RelayCommand addUserCommand;
public ICommand AddUserCommand
{
get
{
return addUserCommand ??
(addUserCommand = new RelayCommand(param => this.AddUser(param.ToString())));
}
}
public vol AddUser(string userId)
{
// Do some stuff
}
现在我想在单击按钮时传递另一个 ICommand 参数。
我要传递的参数是复选框中的值(选中或未选中)。
<CheckBox x:Name="Status" Content="Married"/>
因此视图模型中的 AddUser 方法将具有以下签名:
public vol AddUser(string userId, bool status)
{
// Do some stuff
}
我知道可以结合使用 MultiBinding 和转换器来完成,但我不知道具体怎么做。另外我根本不明白为什么在使用多重绑定时需要转换器。
一个命令只有一个参数。 ICommand
接口的Execute
方法定义为:
void Execute(object parameter);
所以你不能将两个参数传递给一个命令。
您可以做的是传递具有两个属性的 class 实例。这就是多功能转换器的用武之地。
将 CommandParameter
绑定到两个属性并将转换器用于 return 一个对象。
XAML:
<Button x:Name="btnAdd" Command="{Binding AddUserCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource yourConverter}">
<Binding Path="IDUser" />
<Binding Path="IsChecked" ElementName="Status" />
</MultiBinding>
</Button.CommandParameter>
</Button>
转换器:
public class Converter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return new YourClass() { IdUser = values[0] as string, IsChecked = System.Convert.ToBoolean(values[1]) };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
查看模型:
private RelayCommand<YourClass> addUserCommand;
public ICommand AddUserCommand
{
get
{
return addUserCommand ??
(addUserCommand = new RelayCommand<YourClass>(param => this.AddUser(param)));
}
}
public vol AddUser(YourClass obj)
{
string IDUser = obj.IDUser;
bool isChecked = obj.IsChecked;
// Do some stuff
}
当然你还必须使用IDUser
和IsChecked
.
这两个参数来定义YourClass
负载类型
我正在尝试将按钮单击时的两个 ICommand 参数传递给视图模型中的方法。
现在我只能传递一个参数了。
代码在这里。
XAML(查看):
<Button x:Name="btnAdd" Command="{Binding AddUserCommand}"
CommandParameter="{Binding IDUser}"/>
查看模型:
public string IDUser
{
get
{
return this.personalData.UserID;
}
set
{
if (this.personalData.UserID == value)
{
return;
}
this.personalData.UserID = value;
OnPropertyChanged("UserID");
}
}
private RelayCommand addUserCommand;
public ICommand AddUserCommand
{
get
{
return addUserCommand ??
(addUserCommand = new RelayCommand(param => this.AddUser(param.ToString())));
}
}
public vol AddUser(string userId)
{
// Do some stuff
}
现在我想在单击按钮时传递另一个 ICommand 参数。 我要传递的参数是复选框中的值(选中或未选中)。
<CheckBox x:Name="Status" Content="Married"/>
因此视图模型中的 AddUser 方法将具有以下签名:
public vol AddUser(string userId, bool status)
{
// Do some stuff
}
我知道可以结合使用 MultiBinding 和转换器来完成,但我不知道具体怎么做。另外我根本不明白为什么在使用多重绑定时需要转换器。
一个命令只有一个参数。 ICommand
接口的Execute
方法定义为:
void Execute(object parameter);
所以你不能将两个参数传递给一个命令。
您可以做的是传递具有两个属性的 class 实例。这就是多功能转换器的用武之地。
将 CommandParameter
绑定到两个属性并将转换器用于 return 一个对象。
XAML:
<Button x:Name="btnAdd" Command="{Binding AddUserCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource yourConverter}">
<Binding Path="IDUser" />
<Binding Path="IsChecked" ElementName="Status" />
</MultiBinding>
</Button.CommandParameter>
</Button>
转换器:
public class Converter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return new YourClass() { IdUser = values[0] as string, IsChecked = System.Convert.ToBoolean(values[1]) };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
查看模型:
private RelayCommand<YourClass> addUserCommand;
public ICommand AddUserCommand
{
get
{
return addUserCommand ??
(addUserCommand = new RelayCommand<YourClass>(param => this.AddUser(param)));
}
}
public vol AddUser(YourClass obj)
{
string IDUser = obj.IDUser;
bool isChecked = obj.IsChecked;
// Do some stuff
}
当然你还必须使用IDUser
和IsChecked
.
YourClass
负载类型