动态更改 WPF ComboBox 的 ItemsSource

5

我有一个WPF应用程序,其中包含两个下拉框(我们称它们为cbox1和cbox2)。 cbox1通过XAML将ItemsSource绑定到枚举值,如下所示:

<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>
的ItemsSource绑定的枚举看起来像这样:
public enum ModeOfTransportationEnum
{
    [Description("BMW X5")]
    BmwX5,
    [Description("Toyota Camry")]
    ToyotaCamry,
    [Description("Ford Focus")]
    FordFocus
}

当用户在cbox1中选择一项时,我希望能够动态地为cbox2定义ItemsSource。例如,如果用户从cbox1中选择“Toyota Camry”,我希望cbox2显示“红色”和“黑色”这两个值。如果用户从cbox1中选择“Ford Focus”,我可能想让cbox2显示“银色”,“红色”和“蓝色”。
我的示例可能过于简单,但总的来说,我有三个枚举类型,我想将它们用作cbox2的ItemsSource绑定。根据用户在cbox1中选择的内容,我想为cbox2设置相应的枚举类型作为ItemsSource。我认为可以通过类似以下代码实现:
cbox2.SetBinding(ComboBox.ItemsSourceProperty, new Binding("AppropriateEnumGoesHere"));

很遗憾,这似乎不起作用。 我没有收到任何错误提示,但我也没有看到我的枚举值显示在cbox2中。 此外,正如您在上面的cbox1的XAML中所看到的,我正在使用转换器来显示每个枚举值的描述属性。 我想要用作cbox2 .ItemsSource的枚举也具有我想要显示而不是原始枚举值的描述属性,我也不确定代码应该如何工作。 有人可以指点我正确的方向吗? 谢谢!
1个回答

3
最简单的方法是创建一个属性来绑定到第二个ComboBox.ItemsSource属性。我之前使用过类来完成这个操作,但是没有用过enum,所以可能无法工作,但应该可以。通常情况下,我的类必须派生自一个基类,以便属性可以是那种类型。在您的情况下,您可以尝试这样做:
public ObservableCollection<Enum> Collection2 { get; set; } // Implement INPC interface

...

<ComboBox x:Name="cbox2" ItemsSource="{Binding Collection2}" ... />

现在假设您有其他集合,其中包含您的枚举中的所有值:
private List<BmwColours> bmwColours; // Fill these collections with correct values
private List<ToyotaColours> toyotaColours;
private List<FordColours> fordColours;

当用户从第一个 ComboBox 中选择时,您可以像这样使用正确的 enum 值填充 Collection2 属性:

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 值。您可能需要稍作调整以满足您的需求,但它应该可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接