2017年6月30日 星期五

[Windows Form] Property Grid 使用心得 - Part II(TypeConvertor)

再稍微整理一下Property Grid的一些概念:
  1. 顯示的欄位名稱及內容是依SelectedObject內宣告的Properties展開
  2. 顯示樣式則由各Property所擁有的屬性(Attribute)所定義
    1. 值(Value)以外的顯示樣式由以下屬性定義
      1. Display - 控制顯示名稱
      2. Category - 控制群組分類
      3. Description - 控制下方描述
      4. Browsable - 控制是否隱藏
    2. 值(Value)的樣式控制有以下幾方面
      1. Readonly - 控制值可否給使用者輸入
      2. 顯示樣式的控制,由TypeConvertor屬性決定
      3. 編輯器的控制,由EditorAttribute屬性決定
PropertyGrid各顯示樣式控制對應屬性



TypeConvertor
概念上就像是"顯示樣式轉換器",把該欄位的值丟進去對應的Convertor,根據你自訂的邏輯處理後將傳回的值顯示,實作方式為,宣告一Class,繼承TypeConvertor,並複寫
  • ConvertTo
    • 將Object轉為顯示值,通常是String
  • ConvertFrom
    • 將顯示值轉回Object
對於Enum的顯示樣式轉換則需要自訂EnumConvertor,其實EnumConvertor也是繼承自TypeConvertor,尚不清楚此層繼承多了什麼細節,實作方式亦為宣告一Class,並繼承EnumConvertor,複寫ConvertTo/ConvertFrom


 
 class optionEnumConvertor :
        EnumConverter
    {
        /// <summary>
        /// Convert From String To Enum Type
        /// </summary>
        /// <param name="context" />
        /// <param name="culture" />
        /// <param name="value" />
        /// <returns></returns>
        public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            switch (value.ToString())
            {
                case "選項1":
                    return MyEnum.OPTION1;
                case "選項2":
                    return MyEnum.OPTION2;
                default:
                    return null;
            }
        }
        /// <summary>
        /// Convert From Enum Type To String Type
        /// </summary>
        /// <param name="context" />
        /// <param name="culture" />
        /// <param name="value" />
        /// <param name="destinationType" />
        /// <returns></returns>
        public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            switch ((MyEnum)value)
            {
                case MyEnum.OPTION1:
                    return "選項1";
                case MyEnum.OPTION2:
                    return "選項2";
                default:
                    return null;
            }
        }

       public optionEnumConvertor(Type type):base(type)
       {
       }
    }
最後就是在對應的Property上加註TypeConvertor屬性,PropertyGrid就可以根據其指定的TypeConvertor進行樣式轉換了
 
 [DisplayName("想要選什麼?")] // much more human-readable?
        [TypeConverter(typeof(optionEnumConvertor))]
        public MyEnum Property3 { get; set; }

  

註: Enum比較特別的是,可以加註在屬性上,也可以加註在宣告上
 
  [TypeConverter(typeof(optionEnumConvertor))]
    enum MyEnum
    {
        OPTION1,
        OPTION2,
    }


Enum轉String


疑:Code-prettify如何顯示</summary>...不懂
自問自答:XML註解在HTML內當然是要Escaping呀傻傻,把程式貼到這邊Escaping完再貼入<pre>Block中

參考:
程式碼參考

沒有留言:

張貼留言