WPF树视图使用MVVM冻结进入视图

时间:2013-01-29 11:05:22

标签: wpf mvvm treeview

由于数据集的大小,我有一个使用虚拟化的WPF树视图控件。层次结构是客户 - >帐户 - >使用150个客户的示例数据集进行交易,其中大多数只有一个帐户和交易,但有四个有8000个交易。

我需要具有搜索功能来输入事务ID并导航到树视图中的该位置。目前我正在使用MVVM模型,因此搜索事务是微不足道的,当我有节点ViewModel回来时,我可以调用SelectThis()并且它工作正常。但问题是它没有将所选节点带入可视区域。

我有一个函数,它接受一个ViewModel对象并遍历TreeView,直到它找到包含ViewModel的TreeViewItem,它生成容器,然后在TreeViewItem上调用BringIntoView()。

第一次搜索交易时,它可以正常工作。第二次对于不同的交易ID,它会冻结。如果您首先尝试搜索第二个ID,它可以正常工作,它总是在您尝试两次操作时失败。

我真的不明白WPF在幕后做了什么,但我猜我的代码正在做一些事情,生成容器会累积并最终导致代码崩溃,因为太多了。当我在调试器中中断所有内容时,它似乎不断地通过aroudn和aroudn检索每个Transaction对象的绑定依赖项属性,因此不确定为什么当可视区域中只有30个时它会尝试获取这么多属性,它似乎只是试图检索每一个。

在搜索事务的调用之间是否存在一种方法,我可以从TreeView控件中清除所有生成的UI容器和对象,并将其重置为卸载,以便每次搜索都从头开始生成容器?

由于

1 个答案:

答案 0 :(得分:0)

您可以使用ICollectionView通过将TreeView的Itemsource绑定到集合视图来对树视图进行搜索,如下所示

 ICollectionView defaultView = CollectionViewSource.GetDefaultView(treeView.ItemsSource);
 defaultView.Filter += delegate(object item)
 {
    string searchString = searchTextBox.Text;
 }

Link获取进一步的帮助

又一个Reference