结合自定义类的集合的TreeView(Binding collection of custom cl

2019-07-30 07:59发布

我试图确定完成自定义类的集合绑定到一个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对象(但我不知道如何最好参考回到原来的对象选择时)
  • 从树节点类继承,但这个为我存储在多个地方的同一数据感到丑陋(大部分的时间,所以感觉就像是一种资源的浪费,我不需要他们作为树节点)

有什么建议?

Answer 1:

当与一个TreeView处理,我通常最终会生成从树节点和其中认为我显示为节点的实际对象继承的包装类。 我可以绑定到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;
    }
}

这个例子可能正是你你的第二个选项是什么意思。 在这种情况下,我投给了第二个选项!



文章来源: Binding collection of custom classes to TreeView