我正在编写一个控件来探索可以动态创建的树结构。 此控件看起来很像浏览器窗口,“CurrentItem”是打开的文件夹,一些“ChildrenItems”是子文件夹或文件。
要显示ChildrenItems,我正在使用ListBox。当我点击Child Item时,我将新的CurrentItem设置为子Item,并更新ChildrenItems(沿着树)。
从技术上讲,我经常修改ListBox的ItemsSource属性。
我还有一些标准命令,如“Go Up”,“Go Back”,“Root”等
我在“Go Up”命令中遇到了一些问题,并注意到当我将列表框的ItemsSource属性更改为ItemsSource I previoulsy set时,ListBox的SelectedItem将重置为旧的项目时选择的旧项目使用了ItemsSource。
也许一个小例子会更明确:假设我有这种树结构:
- Root
- Node 1
- SubNode 1a
- SubNode 1b
- Node 2
- Node 3
我通过将“CurrentItem”设置为Root来开始探索此结构。这意味着我的ListBox ItemsSource设置为“Node1,Node2,Node3”。
然后我点击“Node1”(它改变了SelectedItem)。然后我的控件将其“CurrentItem”设置为这个新的SelectedItem,并将ListBox ItemsSource设置为“SubNode1a,SubNode1b”。
之后,如果我使用“Go Up”命令,“CurrentItem”将重置为“Root”,ListBox ItemsSource将重置为“Node1,Node2,Node3”,但存在差异:“Node1”被选中。
这让我想到了一个可以重复使用的CollectionViewSource,从而保留了所选的项目。这可能吗?
感谢您的见解。
答案 0 :(得分:1)
我从Bea Stollnitz找到了一个有趣的article,她说:
CollectionViewSource还支持另一个有趣的场景。如果特定CollectionViewSource在不同时间指向不同的集合,则会记住它为包装这些集合而创建的所有视图。如果再次设置过去已设置的源,CVS会识别它并重新使用它最初创建的视图。此行为在分层绑定方案中很有用。
这可能是我正在寻找的答案。我的下一个问题是:是否可以禁用此行为?