- 顯示的欄位名稱及內容是依SelectedObject內宣告的Properties展開
- 顯示樣式則由各Property所擁有的屬性(Attribute)所定義
- 值(Value)以外的顯示樣式由以下屬性定義
- Display - 控制顯示名稱
- Category - 控制群組分類
- Description - 控制下方描述
- Browsable - 控制是否隱藏
- 值(Value)的樣式控制有以下幾方面
- Readonly - 控制值可否給使用者輸入
- 顯示樣式的控制,由TypeConvertor屬性決定
- 編輯器的控制,由EditorAttribute屬性決定
![]() |
| PropertyGrid各顯示樣式控制對應屬性 |
TypeConvertor
概念上就像是"顯示樣式轉換器",把該欄位的值丟進去對應的Convertor,根據你自訂的邏輯處理後將傳回的值顯示,實作方式為,宣告一Class,繼承TypeConvertor,並複寫
- ConvertTo
- 將Object轉為顯示值,通常是String
- ConvertFrom
- 將顯示值轉回Object
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 |


沒有留言:
張貼留言