2016-05-06 53 views
0

我是新来的数据绑定和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界面,我们必须绑定到比萨的列表中的组合框。

我怎样才能有第二个组合框绑定到Gifts属性选定比萨对象在第一个组合框中。

和我该如何禁用第二个组合框当迷你比萨饼被选中

回答

1

在您的视图模型,创建一个bool酒店,拥有get之三是评估框是否应该启用。例如return (SelectedItem.Gifts.Count > 0);

例如为:

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'转换器,它的名字是不言自明的。

这意味着你不会需要可以设立任何额外的视图模型属性,可以在代码中的其他地方使用该转换器。 真的真的建议你看看价值转换器。

希望这会有所帮助!

1

您可以使用DataTrigger。当礼物是空的第二个组合框将被禁用

<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> 
+0

也很好的答案。 –

相关问题