我是数据绑定和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
属性。
以及如何禁用第二个组合框选择迷你披萨时?
答案 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>