2013-11-03 62 views
2

我正在定義一個與PropertyGrid控件一起使用的自定義類。說,其中一個屬性的定義是這樣的:如何動態地或在運行時設置PropertyGrid的DefaultValueAttribute?

[CategoryAttribute("Section Name"), 
DefaultValueAttribute("Default value"), 
DescriptionAttribute("My property description")] 
public string MyPropertyName 
{ 
    get { return _MyPropertyName; } 
    set { _MyPropertyName = value; } 
} 

private string _MyPropertyName; 

正如你看到DefaultValueAttribute定義屬性的默認值。這種默認值在兩種情況下使用:

  1. 如果該屬性的值從默認值之一 PropertyGrid控制將以粗體顯示它改變,並且

  2. 如果我稱之爲PropertyGridResetSelectedProperty方法, 它會將該默認值應用於選定的單元格。

這個概念正常工作,除了DefaultValueAttribute的一個限制。它只接受一個常數值。所以我很好奇,我可以從構造函數或後來的代碼中動態地設置它嗎?

編輯:我能找到this code,讓我讀DefaultValueAttribute

AttributeCollection attributes = TypeDescriptor.GetProperties(this)["MyPropertyName"].Attributes; 
DefaultValueAttribute myAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)]; 
string strDefaultValue = (string)myAttribute.Value; 

是,你怎麼設置的問題?

+0

的DefaultValueAttribute不設置該屬性的值,它是純粹的信息...檢查這個http://stackoverflow.com/questions/705553/net-defaultvalueattribute-on-properties。 – Mate

+0

@Mate:好的。那麼如何設置默認值呢? 「ResetSelectedProperty」方法使用的那個。 – c00000fd

+0

您不能使用該屬性來執行此操作,屬性適用於類型而不是對象。你將不得不提供一個自定義的PropertyDescriptor。覆蓋它的CanResetValue,ResetValue和ShouldSerializeValue成員。儘管它們都只是一行,但需要大量的代碼,一個體面的谷歌查詢是「.net custom propertydescriptor」。 –

回答

11

最後,我得到了答案!我一直在遇到一堆網站,其中展示瞭如何實施ICustomTypeDescriptorPropertyDescriptorhere's one),如果您想將兩頁代碼逐字地添加到10行課程中,這很好。

這是一個更快的方法。我發現一條提示here。祝福那些真正發表建設性意見的人!

所以答案是在你的課堂上提供兩種方法。一個是private bool ShouldSerializePPP(),另一個是private void ResetPPP(),其中PPP是您的屬性名稱。前一種方法將由PropertyGrid調用以確定屬性值是否從默認值更改,並且只要將PropertyGrid項目重置爲默認值,就會調用後一種方法。

這裏是我的類應該如何看待這些增加,這將允許在運行時用來設置屬性的默認值:

[CategoryAttribute("Section Name"), 
DescriptionAttribute("My property description")] 
public string MyPropertyName 
{ 
    get { return _MyPropertyName; } 
    set { _MyPropertyName = value; } 
} 
private bool ShouldSerializeMyPropertyName() 
{ 
    //RETURN: 
    //  = true if the property value should be displayed in bold, or "treated as different from a default one" 
    return !(_MyPropertyName == "Default value"); 
} 
private void ResetMyPropertyName() 
{ 
    //This method is called after a call to 'PropertyGrid.ResetSelectedProperty()' method on this property 
    _MyPropertyName = "Default value"; 
} 

private string _MyPropertyName; 
+0

謝謝!非常非常有幫助。 – Glenn

+0

這對我有效,謝謝。 –

相關問題