2012-07-10 56 views
3

我試圖確定將自定義類的集合綁定到TreeView的最佳方法。將自定義類的集合綁定到TreeView

我現在有兩個自定義類,一個集合中舉行,一個在第一類中的一個集合舉行:

Collection<Device> _devices = new Collection<Device>(); 

class Device 
{ 
    public ulong DeviceID { get; private set; } 

    private List<Capability> _capabilities = new List<Capability>(); 

    public string FriendlyName{ get; set; } 

    public Capability AddCapability(Capability capability) 
    { 
     _capabilities.Add(capability); 
     return capability; 
    } 

    public List<Capability> GetCapabilities() 
    { 
     // not safe yet 
     return _capabilities; 
    } 
} 

abstract class Capability 
{ 
    public uint CapabilityIndex { get; private set; } 
    public string FriendlyName{ get; set; } 
} 

我試圖讓TreeView顯示設備的集合,其展開時列出了這些功能。

選項我已經考慮包括:

  • 通過循環和創建從我想要顯示的數據TreeNode對象(但我不知道如何最好參考回到原來的對象選擇時)
  • 從樹節點類繼承,但這個爲我存儲在多個地方相同的數據(以及大部分的時間,我不需要他們作爲樹節點,所以感覺像資源的浪費)
感覺醜陋

有什麼建議嗎?

回答

9

在處理TreeView時,我通常最終生成一個從TreeNode繼承的包裝類,它包含我作爲節點顯示的實際對象。這樣我可以綁定到TreeView,獲得我需要的層次結構,而我的業務類實際上並不需要爲UI組件創建子類。它在處理TreeView事件時也能很好地工作,因爲您可以檢查節點的類型,並且可以對不同類型的節點進行不同的處理 - 顯示不同的UI或其他內容。

private class FooNode : TreeNode 
{ 
    public FooNode(Foo foo) 
    { 
     this.Text = foo.ToString(); //Or FriendlyName 
     this.Foo = foo; 
     this.Foo.Bars.ForEach(x => this.Nodes.Add(new BarNode(x))); 
    } 

    public Foo Foo 
    { 
     get; 
     private set; 
    } 
} 

private class BarNode : TreeNode 
{ 
    public BarNode(Bar bar) 
    { 
     this.Text = bar.ToString(); //Or FriendlyName 
     this.Bar = bar; 
    } 

    public Bar Bar 
    { 
     get; 
     private set; 
    } 
} 

這個例子可能正是你的第二個選項。在那種情況下,我投票贊成第二種選擇!

+0

出色地工作,我的第二選擇並不完全符合我的要求,但實際上比我想象的更好。謝謝! – 2012-07-10 19:49:45

+0

它不會解析所有成員。它自動化的只是node.Text – 2014-12-13 05:22:33

+0

正是我想要的。對於像我這樣的C#noob,你應該在wpf中使用[link](http://stackoverflow.com/questions/2185892/treenode-forms-to-wpf-conversion)。 – shj 2016-10-20 09:25:51