获取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来做这个。我可以为项目研究所有列表,但项目可以存在两次,并且对于分隔符,项目可以为空。
有谁知道我如何获得所选项目的父列表吗?
非常感谢!
问候,凯文
如果这是树,那么你不需要父节点列表,只需要对父节点的引用:
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
有机会验证添加到它的元素时,可能性是无限的。