【问题标题】:Binding collection of custom classes to TreeView将自定义类的集合绑定到 TreeView
【发布时间】:2012-07-10 02:40:38
【问题描述】:

我正在尝试确定将自定义类的集合绑定到 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 类,但这感觉很难看,因为我将相同的数据存储在多个位置(而且大多数时候我不需要将它们作为 TreeNode,所以感觉像是在浪费资源)

有什么建议吗?

【问题讨论】:

    标签: c# winforms collections treeview


    【解决方案1】:

    在处理 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;
        }
    }
    

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

    【讨论】:

    • 效果很好,与我的第二个选项不太一样,但它实际上比我想象的要好。谢谢!
    • 它不会解析所有成员。它自动化的只是 node.Text
    • 正是我想要的。对于像我这样的 C# 菜鸟,你应该在 wpf 中使用link
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2020-12-29
    • 2014-07-30
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多