2009-09-17 58 views
1

感嘆,另一個PropertyGrid中的問題。我想我可以解決這個問題,直到遇到一個我實際上無法避免的問題。PropertyGrid中 - 動態改變ReadOnlyAttribute

我有一個布爾屬性,有時需要被只讀和有時需要根據從一個TreeView選擇的對象上,以可改變的。

我的問題是如何改變屬性的ReadOnlyAttribute動態?顯然,創建一個布爾變量,然後試圖設置它像ReadOnlyAttribute(boolVar)不起作用,現在我沒有想法。

我能想到的是這個地方屬性是可寫的項目創建單獨的,近乎相同的類的唯一解決方案,一個用於只讀的,但是這似乎有點unelegant給我。

幫助? :)

回答

2

我會做的是創建一個基類與受保護版本的屬性,然後創建一個繼承有隻讀和非只讀位的基類兩類。

3

可以提供關於通過實施ICustomTypeDescriptor的類的屬性的屬性網格的動態信息。

屬性網格將調用ICustomTypeDescriptor.GetProperties(),並返回從PropertyDescriptors派生的對象集合。在你的實現中,你可以覆蓋PropertyDescriptor.IsReadOnly屬性並實現你的邏輯。

這首先是相當多的工作,但它使您能夠動態地返回屬性名稱和描述(有助於本地化),動態地將屬性標記爲只讀,動態地顯示和隱藏屬性,並做許多其他有用的事情。

0

你可以嘗試這些方針的東西,以避免涉及多個類的類型轉換:

class TestClass 
{ 
    private bool isMyPropertyReadOnly; 

    public bool IsMyPropertyReadOnly 
    { 
     get { return isMyPropertyReadOnly; } 
     set { isMyPropertyReadOnly = value; } 
    } 

    private int myVar; 

    public int MyProperty 
    { 
     get { return myVar; } 

     set 
     { 
      if (isMyPropertyReadOnly) 
      { 
       throw new System.Exception("The MyProperty property is read-only."); 
      } 
      else 
      { 
       myVar = value; 
      } 
     } 
    } 
}