• Enum Binding ItemsSource In WPF



    Enum Binding ItemsSource In WPF

     

    在WPF中枚举绑定到ItemsSource。

    一、通过ObjectDataProvider 获取Enum数据源

    首先我们定义一个Enum类:

     public enum TableSelectedType
        {
            SelectedOne,
     
            SelectedTwo,
     
            SelectedThird
        }

    接着在Xaml中的Resource里定义数据源。

    <UserControl.Resources>
            <ObjectDataProvider x:Key="odp" MethodName="GetNames" ObjectType="{x:Type System:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:TableSelectedType"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
     </UserControl.Resources>

    我们这里写好了一个Enum数据源,他的key是odp。我们把它绑定到ComboBox的ItemsSource上看下。

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

    效果图:

    image

    但是有时候,我们要绑定的是Enum,但想显示它相应的中文字符串。比如“SelectOne”显示为“第一条”。

    这里我用到了转换器(Converter).

      
    代码

    xaml中:

      
    代码

    效果:

    image

    二、通过Dictionary来存Enum,并绑定到ItemsSource上

    这种方便且效率高。我们还是用上面的Enum类型。我们声明一个Dictionary的属性TableSelectedTypeCollection ,并对他初始话。

     public partial class ConboBoxEnum : UserControl
        {
            public ConboBoxEnum()
            {
                InitializeComponent();
     
                TableSelectedTypeCollection=new Dictionary<TableSelectedType, string>();
                TableSelectedTypeCollection.Add(TableSelectedType.SelectedOne,"第一条");
                TableSelectedTypeCollection.Add(TableSelectedType.SelectedTwo,"第二条");
                TableSelectedTypeCollection.Add(TableSelectedType.SelectedThird,"第三条");
                this.DataContext = this;
            }
     
            public Dictionary<TableSelectedType, string> TableSelectedTypeCollection { get; set; }
        }

    Xaml中,我们用TableSelectedTypeCollection 来绑定ComboBox的ItemsSource。

    <ComboBox ItemsSource="{Binding TableSelectedTypeCollection}" SelectedValue="{Binding TableSelectedType}" DisplayMemberPath="Value"/>

    这里我们用Value来显示它对应的中文字。SelectedValue来绑定它的Enum类型。因为后台我们通常用Enum中的类型。

    效果还是一样。   image

    三、通过特性(Attribute)来获取

    这里用到了MS命名空间下的using System.ComponentModel;在枚举元素上加Description这个特性。

     public enum TableSelectedType
        {
            [Description("选择第一行")]
            SelectedOne,
            [Description("选择第二行")]
            SelectedTwo,
            [Description("选择第三行")]
            SelectedThird
        }

    我们写一个EnumHelper来获取它。

     public static class EnumHelper
        {
           public static T GetEnumAttribute<T>(Enum source)where T:Attribute
           {
               Type type = source.GetType();
               var sourceName = Enum.GetName(type, source);
               FieldInfo field = type.GetField(sourceName);
               object[] attributes = field.GetCustomAttributes(typeof (T), false);
               foreach (var o in attributes)
               {
                   if (o is T)
                       return (T) o;
               }
               return null;
           }
    
           public static string GetDescription(Enum source)
           {
               var str = GetEnumAttribute<DescriptionAttribute>(source);
               if (str==null)
                   return null;
               return str.Description;
           }
    
        }

    然后我们在实例化这个枚举的时候,调用它就可以。  

     public Dictionary<TableSelectedType, string> TableSelectedTypeDictionary { get; set; }
    public ConboBoxEnum()
            {
                InitializeComponent();
    
                TableSelectedTypeDictionary=new Dictionary<TableSelectedType, string>();
                TableSelectedTypeDictionary.Add(TableSelectedType.SelectedOne, EnumHelper.GetDescription(TableSelectedType.SelectedOne));
                TableSelectedTypeDictionary.Add(TableSelectedType.SelectedTwo, EnumHelper.GetDescription(TableSelectedType.SelectedTwo));
                TableSelectedTypeDictionary.Add(TableSelectedType.SelectedThird, EnumHelper.GetDescription(TableSelectedType.SelectedThird));
    
                this.DataContext = this;
            }
  • 相关阅读:
    【转载】基于TINY4412的Andorid开发-------简单的LED灯控制
    【Android 多媒体应用】使用MediaCodec将摄像头采集的视频编码为h264
    【Android 多媒体应用】使用MediaCodec解码使用SurfaceView显示视频
    【Android 多媒体应用】使用MediaCodec解码使用AudioTrack播放音频数据
    【Android 多媒体应用】使用 TTS
    【Android 多媒体应用】使用 VideoView 播放视频
    【Android 多媒体应用】使用 MediaPlayer 播放视频
    【Android 多媒体应用】使用MediaRecoder录制,MediaPlayer播放音频数据
    Android Binder 系统学习笔记(一)Binder系统的基本使用方法
    【转】Android下面打印进程函数调用堆栈(dump backtrace)的方法
  • 原文地址:https://www.cnblogs.com/changbaishan/p/4414579.html
Copyright © 2020-2023  润新知