Манипулирование ObservableCollection против замены списка - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть внутренний словарь, который используется для синхронизации (т. Е. Как с файловым хранилищем, так и с веб-службой).

Вдобавок ко всему, мне нужно создать списки / перечисления для интерфейса WPF. В чем разница между подключением перечислимого к словарю и вызовом PropertyChanged, когда он обновляется с использованием ObservableCollection, и автоматическим вызовом его CollectionChanged.

Синхронизация происходит в фоновом режиме автоматически, и некоторые элементы могут быть удалены, другие могут быть обновлены. Я хочу беспрепятственно распространять эту информацию в веб-интерфейсе WPF. (т. е. если удален один элемент, не нужно повторно инициализировать весь экран). Я также хочу добавить анимацию, когда элементы добавляются и удаляются (т. Е. Появляются и исчезают) - возможно ли это, если я заменю весь список или это приведет к тому, что каждый отдельный элемент снова исчезнет?

Так я должен:

1) использовать наблюдаемую коллекцию и написать некоторую причудливую логику синхронизации между словарем и коллекцией?

2) использовать методы расширения linq для преобразования словаря в перечислимое и просто вызывать свойство, измененное для перечисляемого, всякий раз, когда оно изменяется?

3) синхронизировать между словарем и списком, заменяя список при каждом его обновлении?

Кроме того, как бы все это работало с операциями сортировки и фильтрации, выполняемыми только для пользовательского интерфейса? (т.е. если мне нужно отфильтровать некоторые элементы из словаря на основе выбора пользователя, должен ли я использовать метод, аналогичный тому, который вы рекомендовали?)

1 Ответ

3 голосов
/ 25 февраля 2010

Если вы «замените» любое IEnumerable<T> при получении изменения, весь список будет обновлен в пользовательском интерфейсе.

Чтобы избежать этого, вам нужно реализовать INotifyCollectionChanged и предоставить коллекцию, которая реализует это. Вместо замены коллекции вы обрабатываете элементы, которые в свою очередь запускают соответствующие события.

ObservableCollection<T> обрабатывает это для вас. Лично, если вам нужно сохранить это в словаре, но вы хотите синхронизировать его со списком, вы можете рассмотреть возможность создания пользовательской коллекции, возможно, основанной на SortedDictionary. Стандартный словарь не имеет смысла упорядочения, что означает, что не было бы способа правильно реализовать INotifyCollectionChanged.

...