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

4
我正在尝试确定将自定义类的集合绑定到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对象(但我不确定在选择时如何最好地引用原始对象)
  • 继承自TreeNode类,但这感觉很丑陋,因为我在多个位置存储相同的数据(大部分时间我不需要它们作为TreeNodes,所以这感觉像是浪费资源)

有任何建议吗?

1个回答

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;
    }
}

这个例子可能恰好符合你所说的第二个选项。如果是这样的话,我投票支持第二个选项!

工作得非常出色,虽然不是我第二选择中想要的,但实际上比我想象中的更好。谢谢! - Graham Wager
它不会解析所有成员。它自动化的只是节点文本。 - Harshal Doshi Jain
正是我想要的。对于像我这样的C#新手,你应该在WPF中使用链接 - inin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接