将枚举属性数据库为WPF中的组合框

将枚举属性数据库为WPF中的组合框

例如,以下代码为例:

public enum ExampleEnum { FooBar, BarFoo }public class ExampleClass : INotifyPropertyChanged{
    private ExampleEnum example;

    public ExampleEnum ExampleProperty 
    { get { return example; } { /* set and notify */; } }}

我希望将属性ExampleProperty数据库绑定到ComboBox,这样它就可以显示“fooBar”和“barfoo”选项,并在双模式下工作。最理想的是,我希望我的ComboBox定义如下所示:

<ComboBox ItemsSource="What goes here?" SelectedItem="{Binding Path=ExampleProperty}" />

目前,我在我的窗口中安装了ComboBox.electionChanged和ExampleClass.PropertyChanged事件的处理程序,我在窗口中手动进行绑定。

有什么更好的或者某种规范的方法吗?您是否通常使用转换器,以及如何使用正确的值填充ComboBox?我现在甚至不想开始使用i18n。

编辑

因此,有一个问题得到了回答:如何用正确的值填充ComboBox。

从静态Enum.GetValue方法中通过ObjectDataProvider将Enum值检索为字符串列表:

<Window.Resources>
    <ObjectDataProvider MethodName="GetValues"
        ObjectType="{x:Type sys:Enum}"
        x:Key="ExampleEnumValues">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="ExampleEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider></Window.Resources>

我可以将它用作ComboBox的ItemsSource:

<ComboBox ItemsSource="{Binding Source={StaticResource ExampleEnumValues}}"/>


12345678_0001
浏览 353回答 3
3回答

红糖糍粑

可以创建自定义标记扩展。使用示例:enum&nbsp;Status{ &nbsp;&nbsp;&nbsp;&nbsp;[Description("Available.")] &nbsp;&nbsp;&nbsp;&nbsp;Available, &nbsp;&nbsp;&nbsp;&nbsp;[Description("Not&nbsp;here&nbsp;right&nbsp;now.")] &nbsp;&nbsp;&nbsp;&nbsp;Away, &nbsp;&nbsp;&nbsp;&nbsp;[Description("I&nbsp;don't&nbsp;have&nbsp;time&nbsp;right&nbsp;now.")] &nbsp;&nbsp;&nbsp;&nbsp;Busy}在XAML的顶部:&nbsp;&nbsp;&nbsp;&nbsp;xmlns:my="clr-namespace:namespace_to_enumeration_extension_class然后.。<ComboBox&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;ItemsSource="{Binding&nbsp;Source={my:Enumeration&nbsp;{x:Type&nbsp;my:Status}}}"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;DisplayMemberPath="Description"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;SelectedValue="{Binding&nbsp;CurrentStatus}"&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;SelectedValuePath="Value"&nbsp;&nbsp;/>以及实施.。public&nbsp;class&nbsp;EnumerationExtension&nbsp;:&nbsp;MarkupExtension &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Type&nbsp;_enumType; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;EnumerationExtension(Type&nbsp;enumType) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(enumType&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentNullException("enumType"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnumType&nbsp;=&nbsp;enumType; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Type&nbsp;EnumType &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;_enumType;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(_enumType&nbsp;==&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;enumType&nbsp;=&nbsp;Nullable.GetUnderlyingType(value)&nbsp;??&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(enumType.IsEnum&nbsp;==&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentException("Type&nbsp;must&nbsp;be&nbsp;an&nbsp;Enum."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_enumType&nbsp;=&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;override&nbsp;object&nbsp;ProvideValue(IServiceProvider&nbsp;serviceProvider) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;enumValues&nbsp;=&nbsp;Enum.GetValues(EnumType); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;object&nbsp;enumValue&nbsp;in&nbsp;enumValues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;new&nbsp;EnumerationMember{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;=&nbsp;enumValue, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Description&nbsp;=&nbsp;GetDescription(enumValue) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).ToArray(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;string&nbsp;GetDescription(object&nbsp;enumValue) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;descriptionAttribute&nbsp;=&nbsp;EnumType &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.GetField(enumValue.ToString()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.GetCustomAttributes(typeof&nbsp;(DescriptionAttribute),&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.FirstOrDefault()&nbsp;as&nbsp;DescriptionAttribute; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;descriptionAttribute&nbsp;!=&nbsp;null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;descriptionAttribute.Description &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;enumValue.ToString(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;EnumerationMember &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;Description&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;object&nbsp;Value&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}

莫回无

在视图模型中,您可以拥有:&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MyEnumType&nbsp;SelectedMyEnumType&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;_selectedMyEnumType;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_selectedMyEnumType&nbsp;=&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnPropertyChanged("SelectedMyEnumType"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IEnumerable<MyEnumType>&nbsp;MyEnumTypeValues &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Enum.GetValues(typeof(MyEnumType)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cast<MyEnumType>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}在XAML中,ItemSource绑定到MyEnumTypeValue,SelectedItem绑定到SelectedMyEnumType。<ComboBox&nbsp;SelectedItem="{Binding&nbsp;SelectedMyEnumType}"&nbsp;ItemsSource="{Binding&nbsp;MyEnumTypeValues}"></ComboBox>
打开App,查看更多内容
随时随地看视频慕课网APP