2012-05-21 245 views
4

因此,對於我正在處理的這個項目,我們決定使用.NET PropertyGrid控件。 propertygrid會根據用戶在ListView控件中選擇的項目,在運行時生成一個對象。動態PropertyGrid屬性

因此,如果他們選擇ListView中的第一項(如「Base」),則PropertyGrid將顯示該組件的屬性,例如其尺寸。然後他們選擇「Top」,它將在PropertyGrid中顯示顏色。無論哪種方式,列表中的每個項目都是一個單一的「組件」對象。

基本上,當一個ListView項被選中時,一個循環遍歷一個數據集來查找哪些屬性與該選定的組件對象相關聯,然後被扔進propertygrid中顯示的propertybag類中。

我想弄清楚,因爲這些組件和屬性都是一個類,我該如何動態確定哪些屬性應該作爲下拉菜單或圖像框或文本字段顯示。

我使用的是Visual Studio 2010/C#.NET,而對於動態屬性生成,我使用了Tony Allowatt在CodeProject上找到的表面上流行的「Property Bag」類。我能想到的唯一的事情就是可能爲數據庫添加一個額外的列,並用它來告訴PropertyBag要添加的數據類型?這似乎是一個熱門話題,但我很難找出如何與動態構建的對象結合使用。

回答

6

它本身並不是一個答案,但我也一直在努力構建這樣一個野獸。這裏是計算器關於這一專題的最偉大的命中...

How to modify PropertyGrid at runtime (add/remove property and dynamic types/enums)

How to display a dynamic object in property grid?

PropertyGrid and Dynamic Types of Objects

在基於Expando的對象首先我雖然我實際需要動態對象,對我來說原來不是這樣。你可能想確保你不陷入這個陷阱。

在我的情況下,我真正需要的是一組自定義對象,它們可以添加一組可變屬性。其中每個屬性都是三個自定義類型(stringType,rangeType或enumType)之一的實例化。一旦我意識到「動態」屬性不會是任意類類型的,那麼這個項目就變成了三個stackoverflow示例中討論的代碼的簡單轉折。有了How to modify PropertyGrid at runtime (add/remove property and dynamic types/enums)這個問題,我幾乎可以直接看到結果。

希望我的隨筆幫助你找到你的路徑......

基思

+0

任何想法如何,可用於WPF Xceed屬性網格?我試過這個代碼,它不兼容 – user1035217

0

相信this link會爲您提供體面的輸入來解決問題。它有幫助。

編輯包含鏈接的內容:

動態性能的宣言:支持動態特性

dynamic employee = new BusinessObject(); 
employee.FirstName = "John"; 
employee.LastName = "Doe"; 

類:

public class BusinessObject : DynamicObject 
{ 
    private readonly IDictionary<string, object> dynamicProperties = 
     new Dictionary<string, object>(); 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
      var memberName = binder.Name; 
      return dynamicProperties.TryGetValue(memberName, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
      var memberName = binder.Name; 
      dynamicProperties[memberName] = value; 
      return true; 
    } 
}