将自定义类的集合绑定到TreeView

时间:2012-07-10 15:11:05

标签: c# winforms collections treeview

我正在尝试确定将自定义类的集合绑定到TreeView的最佳方法。

我目前有两个自定义类,一个在Collection中保存,另一个在第一个类中的Collection中保存:

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对象(但我不确定如何最好在选中时返回原始对象)
  • 从TreeNode类继承但是这感觉很难看,因为我在多个地方存储相同的数据(大多数时候我不需要它们作为TreeNodes,所以感觉就像浪费资源)

有什么建议吗?

1 个答案:

答案 0 :(得分: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;
    }
}

此示例可能正是您的第二个选项的含义。在那种情况下,我投票支持第二种选择!