4

カスタムクラスのコレクションをTreeViewにバインドするための最良の方法を決定しようとしています。

現在、2つのカスタムクラスがあります。1つはコレクションで開催され、もう1つはファーストクラス内のコレクションで開催されます。

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としてそれらを必要としないため、リソースの浪費のように感じます)

助言がありますか?

4

1 に答える 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;
    }
}

この例は、2番目のオプションが意味するものとまったく同じである可能性があります。その場合、私は2番目のオプションに投票します!

于 2012-07-10T15:28:44.190 に答える