使用Data Virtualization,将ViewModel中的属性与View中ItemsControl的SelectedItem绑定的问题

关于WPF中的Data Virtualizatoin, WPF:Data Virtualization是一篇很好的文章。

使用它,Data Virtualization在我的代码中执行得很好,但是有一个问题,就是我无法将ViewModel中的属性与View中的ItemsControl的SelectedItem绑定。 如果一个数据项在数据加载时满足某些条件,则一个项目将在ViewModel中设置为属性,然后它将与View中的ItemsControl的SelectedItem绑定,但不会。

我的代码如下。 关于IItemsProvider和VirtualizationCollection的类型,请参阅WPF:Data Virtualization 。

到目前为止,我尝试过:

  1. 我敢肯定,如果没有使用Data Virtualization,那么Selected Item Binding会很酷。
  2. VirtualizingCollection中的IndexOf(T item)方法始终返回-1。 考虑到这将是问题,我实现了IndexOf(T项)返回实际索引,但它不关心这个问题。

实现IItemsProvider的代码

public class WordViewModelProvider : IItemsProvider { private string _searchText = "some text"; public WordViewModel SelectedItem { get; private set; } #region IItemsProvider Members public int FetchCount() { lock (_words) { int count = (from word in _words where word.Name.Contains(_searchText) select word).Count(); return count; } } public IList FetchRange(int startIndex, int count) { lock (_words) { //Please, regard _word as IEnumerable IQueryable query = (from word in _words where word.Name.Contains(_searchText) select word); List result = query.ToList().ConvertAll(w => { var wordViewModel = new WordViewModel(w, _searchText); if (w.Name.Equals(_searchText, StringComparison.InvariantCultureIgnoreCase)) { SelectedItem = wordViewModel; } return wordViewModel; }); return result; } } #endregion } 

在ViewModel中使用VirtualizingCollection的代码

 public void ViewList() { var wordViewModelProvider = new WordViewModelProvider(); var virtualizingCollection = new VirtualizingCollection(wordViewModelProvider); //IList type to bind with View's ItemsSource. WordViewModels = virtualizingCollection; //WordViewModel type to bind with View's SelectedItem SelectedItem = wordViewModelProvider.SelectedItem; } 

我想发布关于虚拟化的好参考资料来处理WPF中的大数据集。

  • UI虚拟化与数据虚拟化 。

对于虚拟化方法:

  • 保罗麦克莱恩
  • Vincent Van Den Berghe
  • bea.stollnitz : 他/她描述的解决方案结合了前两个人的一些最佳function并涵盖了我的问题。