动态更改WPF ComboBox的ItemsSource

时间:2014-01-08 13:09:32

标签: wpf binding combobox itemssource

我有一个包含两个组合框的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的枚举也有我要显示的描述属性而不是原始枚举值,我也不确定它应该如何起作用。谁能指出我正确的方向?谢谢!

1 个答案:

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