關於WPF中的Data Virtualizatoin,WPF: Data Virtualization是一篇很好的文章。使用數據虛擬化,將ViewModel中的一個屬性與ViewControl中的ItemsControl的SelectedItem綁定的問題
使用這個,Data Virtualization在我的代碼中執行得很好,但存在一個問題,那就是我無法將ViewModel中的屬性與View的ItemsControl的SelectedItem綁定在一起。如果一個數據項在數據加載時滿足一些條件,則將一個項目設置爲ViewModel中的一個屬性,然後它將與View的ItemsControl的SelectedItem綁定,但不會。
我的代碼如下。關於IItemsProvider和VirtualizationCollection的類型,請參考WPF: Data Virtualization。
到目前爲止,我曾嘗試:
- 我敢肯定,如果不使用數據虛擬化,選擇的項目綁定會很酷。
- VirtualizationCollection中的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
}
在視圖模型使用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數據虛擬化解決方案改善?](http://bea.stollnitz.com/blog/?p=378) –