我有一个包含两个组合框的WPF应用程序(我们称之为cbox1和cbox2)。 cbox1的ItemsSource通过XAML绑定到枚举,如下所示:
<Window.Resources>
<local:EnumDescriptionConverter x:Key="enumDescriptionConverter"/>
<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="cbox1DataProvider">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:MyModel+ModeOfTransportationEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<ComboBox x:Name="cbox1" ItemsSource="{Binding Source={StaticResource cbox1DataProvider}}" SelectionChanged="cbox1_SelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
cbox1的ItemsSource绑定的枚举如下所示:
public enum ModeOfTransportationEnum
{
[Description("BMW X5")]
BmwX5,
[Description("Toyota Camry")]
ToyotaCamry,
[Description("Ford Focus")]
FordFocus
}
当我的用户选择cbox1中的项目时,我想动态定义cbox2的ItemsSource。例如,如果我的用户从cbox1中选择“Toyota Camry”,我希望cbox2显示值“Red”和“Black”。如果用户从cbox1中选择“Ford Focus”,我可能希望cbox2显示“Silver”,“Red”和“Blue”。
我可能过度简化了示例,但简而言之,我有三个枚举,我想用于cbox2的.ItemsSource绑定。我想根据用户在cbox1中选择的内容,将适当的枚举设置为cbox2的.ItemsSource。我在想这可以用类似的东西来实现:
cbox2.SetBinding(ComboBox.ItemsSourceProperty, new Binding("AppropriateEnumGoesHere"));
不幸的是,这似乎不起作用。我没有收到错误或其他任何错误,但我也没有看到我的枚举值显示在cbox2中。另外,正如您在上面的cbox1的XAML中所看到的,我正在使用转换器来显示每个枚举值的description属性。我想用作cbox2的.ItemsSource的枚举也有我要显示的描述属性而不是原始枚举值,我也不确定它应该如何起作用。谁能指出我正确的方向?谢谢!
答案 0 :(得分:3)
最简单的方法是创建一个绑定到第二个ComboBox.ItemsSource
属性的属性。现在我已经多次使用类完成此操作,但不是enum
s,因此可能不起作用,但它应该。通常,我的类必须从一个基类派生,因此属性可以是该类型。在你的情况下,你可以试试这个:
public ObservableCollection<Enum> Collection2 { get; set; } // Implement INPC interface
...
<ComboBox x:Name="cbox2" ItemsSource="{Binding Collection2}" ... />
现在假设您有其他集合包含enum
的所有值:
private List<BmwColours> bmwColours; // Fill these collections with correct values
private List<ToyotaColours> toyotaColours;
private List<FordColours> fordColours;
当用户从第一个ComboBox
中进行选择时,您可以使用正确的Collection2
值填充enum
属性,如下所示:
Collection2 = new ObservableCollection<Enum>();
if (cbox1.SelectedItem == ModeOfTransportationEnum.BmwX5)
foreach (Enum enumInstance in bmwColours) Collection2.Add(enumInstance);
else if (cbox1.SelectedItem == ModeOfTransportationEnum.ToyotaCamry)
foreach (Enum enumInstance in toyotaColours) Collection2.Add(enumInstance);
...
现在Collection2
充满了正确的enum
值。您可能需要稍微调整一下以满足您的需求,但它应该可以解决问题。