Используя виртуализацию данных, проблема привязки свойства в ViewModel к SelectedItem из ItemsControl в представлении

О виртуализации данных в WPF можно прочитать в WPF: виртуализация данных.

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

Мой код об этом следующий. О типах 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;
}

person Jin-Wook Chung    schedule 06.07.2011    source источник
comment
Существует хорошая статья, посвященная этому вопросу: Как я могу улучшить существующую виртуализацию данных WPF. решения?   -  person Jin-Wook Chung    schedule 08.07.2011
comment
Эта статья уже несколько лет как мертва, но мне удалось найти ее на старой машине archive.org. Вот ссылка https://web.archive.org/web/20150104001509/http://www.zagstudio.com/blog/378   -  person 0tombo0    schedule 13.01.2021


Ответы (1)


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

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

person Jin-Wook Chung    schedule 15.07.2011
comment
Все ссылки на Беа Столльниц мертвы (июнь 2016 г.). У вас есть информация или исходный код где-то еще? Пожалуйста, поделитесь им, если вы это сделаете, спасибо. - person Hannish; 10.06.2016
comment
@Hannish, к счастью, я реализовал это в прошлом, и код, который я написал дома, где-то на моем компьютере. Мне снова нужно это решение. Microsoft действительно должна просто добавить VirtualizedCollection в библиотеку WPF. - person Lee O.; 31.10.2016
comment
@ЛиО. не могли бы вы загрузить его в DropBox или что-то подобное и опубликовать ссылку для скачивания другими? Спасибо! - person Hannish; 01.11.2016
comment
@Hannish Обнаружил, что мой USB либо потерян, либо все еще упакован, так как я только что переехал месяц назад. Другими словами, я не смог найти его в это время. Я нашел репозиторий на github, который выглядит как очень хорошее представление кода Беа. Очевидно, отсутствует часть блога, которая была очень полезна, когда я делал это в первый раз. Вот репозиторий: github.com/lvaleriu/Virtualization/tree/master/ - person Lee O.; 01.11.2016
comment
@ЛиО. Спасибо чувак! Если вы когда-нибудь найдете USB-накопитель с данными, пожалуйста, опубликуйте его, я уверен, что это поможет многим людям. С наилучшими пожеланиями! - person Hannish; 04.11.2016
comment
@Hannish, я заменил неработающую ссылку Bea Stollnitz. - person Sheridan; 15.11.2017
comment
@Sheridan Спасибо, но, пожалуйста, проверьте свои ссылки, ссылка Винсента Ван Ден Берге указывает на старую неработающую ссылку Беа Столльниц. - person Hannish; 17.11.2017
comment
@Hannish, я проверил изменения, и эта ссылка всегда указывала на этот URL ... Я заменил ссылку bea.stollnitz (последняя ссылка). - person Sheridan; 17.11.2017