关于 WPF 中的数据虚拟化,WPF: Data Virtualization是一篇好文章。
通过使用它,Data Virtualization 在我的代码中执行得很好,但存在一个问题,即我无法将 ViewModel 中的属性与 View 中 ItemsControl 的 SelectedItem 绑定(bind)。如果在加载数据时某一项数据满足某种条件,则该项将被设置为ViewModel中的一个属性,然后它将与View中ItemsControl的SelectedItem绑定(bind),但不会。
我的代码如下。关于IItemsProvider和VirtualizingCollection的类型,请引用WPF: Data Virtualization .
到目前为止,我已经尝试过:
- 我敢肯定,如果不使用数据虚拟化,Selected Item Binding 会很酷。
- VirtualizingCollection 中的 IndexOf(T item) 方法总是返回 -1。考虑到这会是问题所在,我实现了 IndexOf(T item) 返回一个实际索引,但它并不关心这个问题。
IItemsProvider实现代码
public class WordViewModelProvider : IItemsProvider<WordViewModel>
{
private string _searchText = "some text";
public WordViewModel SelectedItem
{
get;
private set;
}
#region IItemsProvider<WordViewModel> Members
public int FetchCount()
{
lock (_words)
{
int count = (from word in _words
where word.Name.Contains(_searchText)
select word).Count();
return count;
}
}
public IList<WordViewModel> FetchRange(int startIndex, int count)
{
lock (_words)
{
//Please, regard _word as IEnumerable<Word>
IQueryable<Word> query = (from word in _words
where word.Name.Contains(_searchText)
select word);
List<WordViewModel> 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<WordViewModel>(wordViewModelProvider);
//IList<WordViewModel> type to bind with View's ItemsSource.
WordViewModels = virtualizingCollection;
//WordViewModel type to bind with View's SelectedItem
SelectedItem = wordViewModelProvider.SelectedItem;
}
最佳答案
我想发布有关虚拟化的很好的引用资料,以处理 WPF 中的大型数据集。
对于虚拟化方法:
- Paul McClean
- Vincent Van Den Berghe
- bea.stollnitz :他/她描述的解决方案结合了前两者的一些最佳功能并涵盖了我的问题。
关于c# - 使用Data Virtualization,ViewModel中的属性与View中ItemsControl的SelectedItem绑定(bind)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592472/