假设我们有2个组合框和一个按钮。按钮单击应将两个组合框的值传递给viewmodel命令。如何获取两个组合框的值并将这两个值传递给命令?
答案 0 :(得分:3)
如果两个Combobox都放在同一个Panel中,您可以发送它的引用并按名称检索组合框。这是不可取的,因为您不应该在ViewModel中处理UI元素。
<StackPanel Name="StackPanel">
<ComboBox Name="FirstComboBox"/>
<ComboBox Name="SecondComboBox"/>
<Button Command="{Binding YourCommand}" CommandParameter="{Binding ElementName=StackPanel}"/>
</StackPanel>
后一种方法是绑定到组合框的值,并使用转换器创建将作为参数发送的类的特定对象。
<强> XAML:强>
<StackPanel Name="StackPanel">
<ComboBox Name="FirstComboBox"/>
<ComboBox Name="SecondComboBox"/>
<Button Command="{Binding YourCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource ComboBoxesToComboClassConverter}">
<Binding ElementName="FirstComboBox" Path="SelectedValue"/>
<Binding ElementName="SecondComboBox" Path="SelectedValue"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</StackPanel>
<强>转换器:强>
class Combo
{
public string FirstComboBoxValue { get; set; }
public string SecondComboBoxValue { get; set; }
}
class ComboBoxesToComboClassConverter: IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new Combo()
{
FirstComboBoxValue = values[0].ToString(),
SecondComboBoxValue = values[1].ToString()
};
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
如果您使用MVVM,则每个ComboBox Value都应该绑定到属性,因此您将同时具有与按钮关联的Command和同一类中的所需属性,因此不需要传递任何内容。
答案 1 :(得分:1)
您可能知道,在MVVM模式中,您可以使用{Binding ...}
语句将依赖项属性绑定到ViewModel。所以你应该添加这个
SelectedValue="{Binding ComboboxValue1, Mode=TwoWay}"
和
SelectedValue="{Binding ComboboxValue2, Mode=TwoWay}"
进入View(XAML)中的组合框定义。之后,当用户更改其中的内容时,ComboboxValue1
和ComboboxValue2
属性将会收到通知。现在,您可以随意在ViewModel中的命令处理程序中使用这些值进行操作,这些值绑定到您的按钮。