WPF将多个参数传递给命令

时间:2015-07-25 16:06:49

标签: c# wpf events commandbinding

假设我们有2个组合框和一个按钮。按钮单击应将两个组合框的值传递给viewmodel命令。如何获取两个组合框的值并将这两个值传递给命令?

2 个答案:

答案 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)中的组合框定义。之后,当用户更改其中的内容时,ComboboxValue1ComboboxValue2属性将会收到通知。现在,您可以随意在ViewModel中的命令处理程序中使用这些值进行操作,这些值绑定到您的按钮。