我有一个WPF应用程序,其中包含两个组合框(我们将其称为cbox1和cbox2)。 cbox1通过XAML将其ItemsSource绑定(bind)到枚举,如下所示:
<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绑定(bind)到的枚举如下所示:
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绑定(bind)。我想根据用户在cbox1中选择的内容,将适当的枚举设置为cbox2的.ItemsSource。我以为可以通过类似于以下的方式来实现:
cbox2.SetBinding(ComboBox.ItemsSourceProperty, new Binding("AppropriateEnumGoesHere"));
不幸的是,这似乎不起作用。我没有收到任何错误或任何提示,但是我也没有看到我的枚举值显示在cbox2中。另外,正如您在上述针对cbox1的XAML中所看到的那样,我正在使用一个转换器来显示每个枚举值的description属性。我想用作cbox2的.ItemsSource的枚举也具有要显示的描述属性,而不是原始的枚举值,我也不确定该如何通过代码工作。谁能指出我正确的方向?谢谢!
最佳答案
最简单的方法是创建一个属性以绑定(bind)到第二个ComboBox.ItemsSource
属性。现在,我已经对类做了很多次了,但是对enum
却没有,所以它可能行不通,但应该可以。通常,我的类必须从一个基类派生,以便该属性可以是该类型。在您的情况下,您可以尝试以下操作:
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
值。您可能需要稍微调整一下以适应您的需求,但是应该可以解决问题。关于wpf - 动态更改WPF组合框的ItemsSource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20996611/