gpt4 book ai didi

wpf - 动态更改 WPF ComboBox 的 ItemsSource

转载 作者:行者123 更新时间:2023-12-04 23:24:23 25 4
gpt4 key购买 nike

我有一个 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 中所见,我使用转换器来显示每个枚举值的描述​​属性。我想用作 cbox2 的 .ItemsSource 的枚举也有我想显示的描述属性,而不是原始枚举值,我也不确定代码应该如何工作。谁能指出我正确的方向?谢谢!

最佳答案

最简单的方法是创建一个属性来绑定(bind)到第二个 ComboBox.ItemsSource属性(property)。现在我在类里面做过很多次了,但不是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 的属性值(value)观是这样的:
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值(value)观。您可能需要稍微调整一下以满足您的需求,但它应该可以解决问题。

关于wpf - 动态更改 WPF ComboBox 的 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com