gpt4 book ai didi

c# - 将自定义类的集合绑定(bind)到 TreeView

转载 作者:行者123 更新时间:2023-11-30 13:48:47 24 4
gpt4 key购买 nike

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

有什么建议吗?

最佳答案

在处理 TreeView 时,我通常最终会生成一个包装类,它继承自 TreeNode 并保存我显示为节点的实际对象。这样我就可以绑定(bind)到 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;
}
}

这个例子可能正是您所说的第二个选项的意思。既然如此,我投第二个选项!

关于c# - 将自定义类的集合绑定(bind)到 TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com