При использовании виртуализации данных проблема связывания свойства в ViewModel с SelectedItem для ItemsControl в View - PullRequest
2 голосов
/ 06 июля 2011

О виртуализации данных в WPF, WPF: Виртуализация данных - хорошая статья.

При использовании этого виртуализация данных в моем коде была выполнена хорошо, но есть одна проблемаЭто то, что я не могу связать свойство в ViewModel с SelectedItem ItemsControl в View.Если один элемент данных удовлетворяет некоторому условию во время загрузки данных, один элемент будет установлен как свойство в ViewModel, а затем он будет связан с SelectedItem of ItemsControl в View, но не будет.

Мой код об этомэто следующее.О типах IItemsProvider иVirtualizingCollection см. WPF: Виртуализация данных .

До сих пор я пробовал:

  1. Я уверен, что еслиВиртуализация данных не использовалась, привязка выбранного элемента была бы классной.
  2. Метод 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;
}

1 Ответ

3 голосов
/ 15 июля 2011

Я хотел бы опубликовать хорошие отзывы о Виртуализация , чтобы иметь дело с большим набором данных в WPF.

Для подходов виртуализации:

...