【问题标题】:WPF treeview bring into view, using MVVM freezes使用 MVVM 冻结 WPF 树视图
【发布时间】:2013-01-29 19:26:17
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: wpf mvvm treeview


    【解决方案1】:

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

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

    Link 获取更多帮助

    还有一个Reference

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多