使用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 。
到目前为止,我尝试过:
- 我敢肯定,如果没有使用Data Virtualization,那么Selected Item Binding会很酷。
- 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并涵盖了我的问题。