0

私の問題は次のとおりです。私はItemsSourceにバインドされているtreeViewを持っています。SelectedItem は、ViewModel 内の SelectedItem というプロパティにバインドされています。

ItemsSource は次のように構築されます。

public class Item
{
      public Header { get; set; }
      public ObservableCollection<Item> ItemChildren { get; set; }
.
.
.
}

アイテムを削除、並べ替えたい... したがって、これを行うには SelectedItem の親リストが必要です。アイテムのすべてのリストを調査できますが、アイテムが 2 回存在する可能性があり、セパレーターの場合、アイテムが null になる可能性があります。

選択したアイテムの親リストを取得する方法を知っている人はいますか?

ありがとうございます!

よろしく、 ケビン

4

1 に答える 1

1

それがツリーの場合、親のリストは必要ありませんが、親への参照のみが必要です。

public class Item
{
    public Item() 
    {
        _col = new ObservableCollection<Item>();
        _col.CollectionChanged +=
            new NotifyCollectionChanged(ItemChildren_CollectionChanged);
    }

    public Header { get; set; }
    public ObservableCollection<Item> ItemChildren
    { get { return _col; } }

    public Item Parent { get { return _parent; } }

    private void ItemChildren_CollectionChanged(
        object sender,
        NotifyCollectionChangedEventArgs e)
    {
        // for all newly added items: item._parent = this;
        // for all removed items: item._parent = null;
    }

    private Item _parent;
    private ObservableCollection<Item> _col;

}

このソリューションは、最初のソリューションよりも複雑です。親オブジェクトはその子を追跡し、子が追加されるたびに子オブジェクトの親がそれに設定されていることを確認する必要があります。

構文チェックなしでこのコードを入力してきましたが、的を得ています。この記事で、ほぼ同じ質問のソース コード全体を見つけることができます: How to Implement Collection Property to Contain Unique Objects .

編集:上記のコードのクラスでは、呼び出し元がコレクションItemを設定できないことに注意してください。ItemChildrenそのコレクションは Item インスタンスによって作成および提供され、誰もそれを変更することはできません。ただし、誰でもアイテムを追加/削除できます。もう 1 つは、Item が新しく追加された子アイテムを処理する方法です。InvalidOperationException誰かが null 以外の親参照を持つアイテムを追加しようとすると、自由にスローできます。これにより、構造がツリーのままになります。たとえば、引数がすでに現在のノードの祖先である場合、XmlNodeクラス ( ) はメソッドからSystem.Xmlスローします。追加された要素を検証する機会があれば、可能性は無限大です。InvalidOperationExceptionAppendChildItem

于 2013-05-21T13:57:31.710 に答える