2012-03-28 110 views
1

只是偶然發現了propertyGrid及其真棒!然而,我有一個任務,我無法找到如何處理它:編輯多個對象時,propertyGrid中屬性的C#有條件顯示

我有一個類有一個類型。基於類型,它具有不同的可用屬性。爲了簡單起見,我將它保留在一個類中(不是多個繼承類)(有十種類型,但它們大多具有相同的屬性)。

例如,我有一個MapObject類,它的字符串類型可以等於「玩家」或「敵人」。對於「敵人」,使用屬性「名稱」,但對於「玩家」則爲空(未使用)。

當我選擇兩個對象,其中一個是「玩家」類型,另一個是「敵人」類型時,我希望屬性「名稱」只爲「敵人」「計數」。所以,我想讓propertyGrid顯示具有type =「enemy」的對象的名稱,並且在Grid中更改它(name屬性)時,只將其分配給「enemy」類型的對象。

這可能嗎?

+0

所以,只是爲了澄清,類的變化取決於一些屬性中的數據? – Matt 2012-03-28 17:19:27

+0

我希望它的行爲就好像沒有使用屬性的對象並不是爲了propertyGrid對象的所有目的而選擇的。 – Istrebitel 2012-03-28 18:17:22

+1

讓我們做一個非常簡單的例子。 ClassA具有三個屬性i,x,y,如果i = 1,則使用x並且不使用y,如果i = 2,則使用x和y。讓我們假設o1.i = 2 o1.y = 1,o2.i = 2 o2.y = 2,o3.i = 1。如果我選擇o1和o2,propertyGrid將顯示y屬性的空白,因爲o1具有與o2不同的y屬性。沒關係。但我希望它顯示o1.y屬性,如果我選擇o1和o3,並且我希望它將y屬性的更改僅應用於o1在這種情況下 – Istrebitel 2012-03-28 18:19:47

回答

0

這是一種被稱爲狀態模式的設計模式。這很容易實現,你不需要屬性網格。 http://www.dofactory.com/Patterns/PatternState.aspx

+0

我研究了它並出現問題。由於這是一個屬於類的屬性,它將在propertyGrid中顯示 - 嵌套在一種根本不需要的「文件夾」中。有沒有辦法解決它? – Istrebitel 2012-04-03 08:00:31

0

根據您使用的PropertyGrid的不同,切換Browsable屬性可以做你想做的事情。請參閱我的answer here瞭解如何在運行時執行此操作。

如果和我一樣,您正在使用Xceed PropertyGrid,那麼只有在控件加載後纔在運行時更改Browsable屬性並不會執行任何操作。相反,我也必須修改PropertyDefinitions集合。這裏是一個擴展方法:

/// <summary> 
    /// Show (or hide) a property within the property grid. 
    /// Note: if you want to initially hide the property, it may be 
    /// easiest to set the Browable attribute of the property to false. 
    /// </summary> 
    /// <param name="pg">The PropertyGrid on which to operate</param> 
    /// <param name="property">The name of the property to show or hide</param> 
    /// <param name="show">Set to true to show and false to hide</param> 
    public static void ShowProperty(this PropertyGrid pg, string property, bool show) 
    { 
     int foundAt = -1; 
     for (int i=0; i < pg.PropertyDefinitions.Count; ++i) 
     { 
      var prop = pg.PropertyDefinitions[i]; 
      if (prop.Name == property) 
      { 
       foundAt = i; 
       break; 
      } 
     } 
     if (foundAt == -1) 
     { 
      if (show) 
      { 
       pg.PropertyDefinitions.Add(
        new Xceed.Wpf.Toolkit.PropertyGrid.PropertyDefinition() 
        { 
         Name = property, 
        } 
       ); 
      } 
     } 
     else 
     { 
      if (!show) 
      { 
       pg.PropertyDefinitions.RemoveAt(foundAt); 
      } 
     } 
    } 
相關問題