获取TreeView中的父列表

本文关键字:列表 TreeView 获取 | 更新日期: 2023-09-27 18:14:43

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

ItemsSource的构建如下:

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

我想删除,重新排序…的物品。我需要SelectedItem的父List来做这个。我可以为项目研究所有列表,但项目可以存在两次,并且对于分隔符,项目可以为空。

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

非常感谢!

问候,凯文

获取TreeView中的父列表

如果这是树,那么你不需要父节点列表,只需要对父节点的引用:

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;
}

这个解决方案比你开始的解决方案更复杂。父对象必须跟踪它的子对象,并确保每次子对象被添加到它时,子对象的Parent被设置为它。

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

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