为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

12345678_0001 2019-07-26 15:14:54
将枚举属性数据库为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}}"/>
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

可以创建自定义标记扩展。

使用示例:

enum Status{
    [Description("Available.")]
    Available,
    [Description("Not here right now.")]
    Away,
    [Description("I don't have time right now.")]
    Busy}

在XAML的顶部:

    xmlns:my="clr-namespace:namespace_to_enumeration_extension_class

然后.。

<ComboBox 
    ItemsSource="{Binding Source={my:Enumeration {x:Type my:Status}}}" 
    DisplayMemberPath="Description" 
    SelectedValue="{Binding CurrentStatus}"  
    SelectedValuePath="Value"  />

以及实施.。

public class EnumerationExtension : MarkupExtension
  {
    private Type _enumType;


    public EnumerationExtension(Type enumType)
    {
      if (enumType == null)
        throw new ArgumentNullException("enumType");

      EnumType = enumType;
    }

    public Type EnumType
    {
      get { return _enumType; }
      private set
      {
        if (_enumType == value)
          return;

        var enumType = Nullable.GetUnderlyingType(value) ?? value;

        if (enumType.IsEnum == false)
          throw new ArgumentException("Type must be an Enum.");

        _enumType = value;
      }
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
      var enumValues = Enum.GetValues(EnumType);

      return (
        from object enumValue in enumValues        select new EnumerationMember{
          Value = enumValue,
          Description = GetDescription(enumValue)
        }).ToArray();
    }

    private string GetDescription(object enumValue)
    {
      var descriptionAttribute = EnumType
        .GetField(enumValue.ToString())
        .GetCustomAttributes(typeof (DescriptionAttribute), false)
        .FirstOrDefault() as DescriptionAttribute;


      return descriptionAttribute != null
        ? descriptionAttribute.Description
        : enumValue.ToString();
    }

    public class EnumerationMember
    {
      public string Description { get; set; }
      public object Value { get; set; }
    }
  }




查看完整回答
反对 回复 2019-07-27
?
莫回无

TA贡献1865条经验 获得超7个赞

在视图模型中,您可以拥有:

    public MyEnumType SelectedMyEnumType 
    {
        get { return _selectedMyEnumType; }
        set { 
                _selectedMyEnumType = value;
                OnPropertyChanged("SelectedMyEnumType");
            }
    }

    public IEnumerable<MyEnumType> MyEnumTypeValues
    {
        get
        {
            return Enum.GetValues(typeof(MyEnumType))
                .Cast<MyEnumType>();
        }
    }

在XAML中,ItemSource绑定到MyEnumTypeValue,SelectedItem绑定到SelectedMyEnumType。

<ComboBox SelectedItem="{Binding SelectedMyEnumType}" ItemsSource="{Binding MyEnumTypeValues}"></ComboBox>




查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 352 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信