如何将一个组合框绑定到另一个组合框中选择的对象?

时间:2016-05-06 20:19:34

标签: c# wpf binding

我是数据绑定和WPF的新手,所以如果我的问题很简单,我会道歉。

让我用一个简单的例子解释我的问题:

假设一家餐厅有三种比萨饼:迷你比萨饼,普通比萨饼和大比萨饼。 经理希望根据订单价格向顾客提供小礼物。

普通披萨的礼物是一个小钥匙链:

class pizza_ordinary : pizza
{
    Public List<string> Gifts
    {
        get
        {
            return new List<string>()
            {
                "Small Keychain Blue",
                "Small Keychain Red"
            };
        }
    }
}

大披萨的方式类似:

class pizza_large: pizza
{
 ...
     {
     "Big Keychain Yellow",
     "Big Keychain Green",
     "Big Keychain Pink"
     }
 ...
}

但迷你披萨没有任何礼物,也没有礼物属性。

因此,在WPF界面中,我们将一个Combobox绑定到Pizzas列表。

如何在第一个组合框中有第二个组合框绑定到选定的Pizza对象Gifts属性。

以及如何禁用第二个组合框选择迷你披萨时

2 个答案:

答案 0 :(得分:1)

在ViewModel中,使用bool ter创建一个get属性,用于评估是否应启用此框。例如return (SelectedItem.Gifts.Count > 0);

E.g:

public bool IsSecondComboBoxEnabled
{
    get { return (SelectedItem.Gifts.Count > 0); }
}

在视图上,将第二个组合框的IsEnabled属性绑定到视图模型中的此属性。

像这样:

<ComboBox x:Name="secondComboBox" ItemsSource="{Binding SelectedPizza.Gifts}"
          IsEnabled="{Binding IsSecondComboBoxEnabled}" >
... some pretty ComboBox item styling going on here ...
</ComboBox>

然后,当您从第一个组合框更新SelectedItem时,请确保为您创建的新属性调用PropertyChanged,以更新视图。

像这样:

public SelectedItem SelectedPizza
{
    get { return this.selectedPizza; }
    set 
    {
        this.selectedPizza = value;
        OnPropertyChanged(() => SelectedPizza);
        OnPropertyChanged(() => IsSecondComboBoxEnabled);
    }
}

此外阅读使用XAML的值转换器。他们真的很有用。 Here's a link.

在这种情况下,您可以使用一个`IsCollectionNotNullOrEmptyToBoolean'转换器,该名称是不言自明的。

这意味着您不需要设置任何额外的ViewModel属性,并且可以在代码中的其他地方使用转换器。 真的非常建议您查看价值转换器。

希望这有帮助!

答案 1 :(得分:1)

您可以使用DataTrigger。当Gifts为Null时,第二个ComboBox将被禁用

<ComboBox x:Name="PizzaCB" ItemsSource="{Binding ListPizza}">

</ComboBox>
<ComboBox x:Name="GiftCB" ItemsSource="{Binding ElementName=PizzaCB, Path=SelectedItem.Gifts}">
    <ComboBox.Style>
        <Style TargetType="ComboBox">
            <Setter Property="IsEnabled" Value="True"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=PizzaCB, Path=SelectedItem.Gifts}" Value="{x:Null}">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>