ItemsControl.ItemsSource MVVM производительность - PullRequest
5 голосов
/ 17 марта 2010

У меня есть (не виртуализированный) ItemsControl, который связывает свой ItemsSource с ObeservableCollection экземпляров ViewModel. Теперь, когда большое количество экземпляров Model загружено, все компоненты ViewModel должны быть добавлены к этой ObservableCollection. Как я могу добавить большое количество ViewModels без зависания потока пользовательского интерфейса?

Я полагаю, что поток пользовательского интерфейса зависает, потому что каждый раз, когда добавляется новый элемент, ItemsControl должен обновляться, выполнять разметку и т.д. снова и снова.

  • Должен ли я приостановить привязку, добавить все предметы, а затем возобновить? Если да, то как?
  • Должен ли я переопределить ObservableCollection для реализации AddRange, так что только 1 CollectionChanged Событие запускается для добавления нескольких Предметы? Или в качестве альтернативы просто заменить вся коллекция?
  • или лучше добавить каждый элемент отдельно и позвонить Dispatcher.Invoke для каждого элемента по отдельности? Так что я бы разблокировал часто.

Как вы обрабатываете большие динамические списки, которые нельзя виртуализировать?

Ответы [ 2 ]

10 голосов
/ 17 марта 2010

Вы можете создать класс, производный от ObservableCollection , который позволит вам временно приостановить CollectionChanged события, подобные этому:

public class SuspendableObservableCollection : ObservableCollection
{
    private bool suspended;

    public bool Suspended 
    {
        get
        {
            return this.suspended;
        }
        set
        {
            this.suspended = value;
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Reset));
        }
    }

    protected override void OnCollectionChanged(
        NotifyCollectionChangedEventArgs args)
    {
       if (!Suspended)
       {
           base.OnCollectionChanged(args);
       }
    }
}
0 голосов
/ 06 октября 2010
<ItemsControl IsAsync="True" ... />
...