传递两个命令参数上的按钮点击WPF NET 3.5 MVVM
问题描述:
我想通过按钮上的两个ICommand参数点击视图模型中的方法。传递两个命令参数上的按钮点击WPF NET 3.5 MVVM
现在我只能传递一个参数。
代码在这里。
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);
所以不能传递两个参数的命令。
你可以做的是传递一个具有两个属性的类的实例。这是多功能转换器的功能。
将CommandParameter
绑定到两个属性,并使用转换器返回一个对象。
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
。
+0
@ user1624552:你试过这个吗? – mm8
虽然绑定可能比您想要的更冗长,但它也可能是正确的选择。如果你确实需要一个转换器,你需要它的原因是你会从一个方法返回一个(DTO)对象:因为该方法只能返回一件事情。 –
也许一个很好的[发布](https://*.com/questions/15759308/do-you-have-to-use-a-converter-when-using-multibinding-in-wpf)回答_为什么一个转换器是使用多重绑定时需要._ –
为什么复选框未绑定到您的视图模型?如果是这样,你可以简单地看看价值。 – Will