0

我的问题如下:我有一个绑定到 ItemsSource 的 treeView。SelectedItem 绑定到我的 ViewModel 中名为 SelectedItem 的属性。

ItemsSource 的构建方式如下:

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

我想删除、重新排序……这些项目。所以我需要 SelectedItem 的父列表来执行此操作。我可以研究该项目的所有列表,但该项目可以存在两次,并且对于分隔符,该项目可以为空。

有谁知道我如何获得所选项目的父列表?

非常感谢!

问候,凯文

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;

}

此解决方案比您开始使用的解决方案更复杂。父对象必须跟踪其子对象,并确保每次将子对象添加到子对象时都将其设置为子对象的父对象。

我一直在输入这段代码而没有进行语法检查,但它恰到好处。您可以在本文中找到几乎相同问题的完整源代码:如何实现集合属性以包含唯一对象

编辑:请注意,Item上面代码中的类不允许调用者设置ItemChildren集合。该集合由 Item 实例创建和服务,并且不允许任何人更改它。但是任何人都可以在其中添加/删除项目。另一件事是 Item 处理新添加的子项的方式 -InvalidOperationException如果有人尝试添加具有非 null Parent 引用的项,您可以随意抛出!这将确保您的结构仍然是树。例如,如果参数已经是当前节点的祖先,则XmlNodeclass ( )从方法中System.Xml抛出。当有机会验证添加到其中的元素时,可能性是无穷无尽的。InvalidOperationExceptionAppendChildItem

于 2013-05-21T13:57:31.710 回答