【问题标题】:Dynamically changing ItemsSource of a WPF ComboBox动态更改 WPF ComboBox 的 ItemsSource
【发布时间】:2014-01-26 14:38:44
【问题描述】:

我有一个 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>

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 中选择“福特福克斯”,我可能希望 cbox2 显示“银色”、“红色”和“蓝色”。

我可能过度简化了示例,但简而言之,我有三个枚举,我想将它们用于 cbox2 的 .ItemsSource 绑定。我想根据用户在 cbox1 中选择的内容将适当的枚举设置为 cbox2 的 .ItemsSource。我在想这可以通过类似的东西来完成:

cbox2.SetBinding(ComboBox.ItemsSourceProperty, new Binding("AppropriateEnumGoesHere"));

不幸的是,这似乎不起作用。我没有收到错误或任何东西,但我也没有看到我的枚举值显示在 cbox2 中。此外,正如您在上面的 cbox1 的 XAML 中所见,我使用转换器来显示每个枚举值的描述​​属性。我想用作 cbox2 的 .ItemsSource 的枚举也有我想显示的描述属性,而不是原始枚举值,我也不确定代码应该如何工作。谁能指出我正确的方向?谢谢!

【问题讨论】:

    标签: wpf binding combobox itemssource


    【解决方案1】:

    最简单的方法是创建一个属性以绑定到第二个ComboBox.ItemsSource 属性。现在我已经多次使用类完成此操作,但不是enums,所以它可能不起作用,但它应该。通常,我的类必须从一个基类派生,以便该属性可以是该类型。在你的情况下,你可以试试这个:

    public ObservableCollection<Enum> Collection2 { get; set; } // Implement INPC interface
    
    ...
    
    <ComboBox x:Name="cbox2" ItemsSource="{Binding Collection2}" ... />
    

    现在假设您有其他集合,其中包含您的 enums 的所有值:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 2019-09-11
      • 2013-06-30
      • 2015-04-07
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多