zoukankan      html  css  js  c++  java
  • WPF Displaying enums in ComboBox control

    « Hiding from Debugger | Main | WPF: Gadget-Style User Experience »

    WPF - Displaying enums in ComboBox control

    Displaying enums in ComboBox in WPF isn't really rocket science. The issue however comes when you want to display user friendly strings against the enum values. Enum unfortunately doesn't support this by a simple override to the ToString method.

    The usual approach people take is the use the DescriptionAttribute. This attribute is assigned to each enum value and at runtime, using reflection, the value of the attribute is queried and is then displayed. The approach is definitely worth considering and I found an implementation of the same and a custom WPF ComboBox that will display such user friendly enum strings here.

    However reflection does mean a bit of performance impact and depending on the size of the enum, this can vary. In the above implementation, the values are hence cached for any reuse and improve efficiency. However if the binding happens only once, this has no effect.

    I was hence wondering on how to do this without having to use reflection. I then hit upon an idea of using a dictionary object with the enum as the key and the value as the user friendly string. It was then a matter of binding this with the ComboBox and set the DisplayMemberPath appropriately. In order to ensure that the enum and this dictionary collection go hand in hand, I decided to encapsulate them in a single class. There is definitely a maintenance overhead of ensuring that appropriate key value pair is added to the dictionary for each enum. See the code for this class below.

        internal class Utility

        {

            static Utility()

            {

                //initialize the collection with user friendly strings for each enum

                _monthCol = new Dictionary<Months, string>(){

                    {Months.Jan, "January"},

                    {Months.Feb, "February"},

                    {Months.Mar, "March"},

                    {Months.Apr, "April"},

                    {Months.May, "May"},

                    {Months.Jun, "June"},

                    {Months.Jul, "July"},

                    {Months.Aug, "August"},

                    {Months.Sep, "September"},

                    {Months.Oct, "October"},

                    {Months.Nov, "November"},

                    {Months.Dec, "December"}};

     

            }

     

            public enum Months

            {

                Jan,

                Feb,

                Mar,

                Apr,

                May,

                Jun,

                Jul,

                Aug,

                Sep,

                Oct,

                Nov,

                Dec

            }

     

            private static Dictionary<Months, string> _monthCol;

            public static Dictionary<Months, string> MonthCollection

            {

                get

                {

                    return _monthCol;

                }

            }

        }

    and in XAML, this Utility class can be instantiated as a resource and then referenced in the ComboBox creation.  

                <ComboBox ItemsSource="{Binding Source={StaticResource monthCollection}, Path=MonthCollection}" SelectedIndex="0" DisplayMemberPath="Value" SelectedValuePath="Key" />

    Note that the SelectedValuePath property has also been set to point to the Key in the dictionary. with this, it is easy to handle the selection changed event and the combobox's SelectedValue property will then be the enum value and you can then easily use a switch/case block to handle it appropriately. If  you don't do it, you can still easily cast this to get to the enum value as below

                switch(((KeyValuePair<Utility.Months, string>)cmbBox.SelectedValue).Key)

                {

                    //your case statements here

                    default:

                        //custom logic

                    break;

                }

  • 相关阅读:
    OnGUI 音频
    Java 8 的一些新特性
    获取文件编码格式
    js 常用 正则
    C#中这个算是什么
    数据的批量增加
    Ehcache的配置(自学,有问题请指出)
    Linux 下配置和使用java、Tomcat
    StringBuffer和StringBuildr的区别
    Oracle中复制一张表的结构,用sql语句复制一张表结构
  • 原文地址:https://www.cnblogs.com/rickiedu/p/2041894.html
Copyright © 2011-2022 走看看