О виртуализации данных в WPF, WPF: Виртуализация данных - хорошая статья.
При использовании этого виртуализация данных в моем коде была выполнена хорошо, но есть одна проблемаЭто то, что я не могу связать свойство в ViewModel с SelectedItem ItemsControl в View.Если один элемент данных удовлетворяет некоторому условию во время загрузки данных, один элемент будет установлен как свойство в ViewModel, а затем он будет связан с SelectedItem of ItemsControl в View, но не будет.
Мой код об этомэто следующее.О типах IItemsProvider иVirtualizingCollection см. WPF: Виртуализация данных .
До сих пор я пробовал:
- Я уверен, что еслиВиртуализация данных не использовалась, привязка выбранного элемента была бы классной.
- Метод IndexOf (T item) в VirtualizingCollection возвращает всегда -1.Поскольку, думая, что это будет проблемой, я понял, что IndexOf (элемент T) возвращает фактический индекс, но он не имел отношения к этой проблеме.
Код реализации 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 во ViewModel
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;
}