Вы столкнулись с точно такой же проблемой, с которой я столкнулся, пытаясь выяснить, как сохранить ObservableCollection
в моей синхронизации ViewModel с простой старой коллекцией в моей модели.ObservableCollection
замечательно, потому что представление может привязываться к нему и автоматически изменяться при изменении коллекции.К сожалению, вы только что перенесли проблему синхронизации на один уровень вниз.
Один из вариантов - использовать ObservableCollections везде, даже в модели.Это не очень чистая архитектура, потому что MVVM не должен предъявлять какие-либо требования к модели.
Что я сделал, чтобы решить ее, так это представил Presenter, поэтому моя архитектура выглядит следующим образом:
View -> ViewModel <-> Presenter <-> Model
Также я сделал свои ViewModels немыми .Вот как типичное действие пользователя происходит от инициации до завершения:
- Пользователь нажимает кнопку Добавить
- ViewModel либо вызывает событие, на которое подписчик подписывается, либо вызывает метод дляPresenter, или просто вызывает обратный вызов, который Presenter предоставил ViewModel при создании ViewModel.По сути, он делегирует действие Presenter.
- Presenter вызывает Add для модели.
- Модель реагирует на вызов Add, обновляя все соответствующие состояния, включая обычноеcollection.
- Презентатор, выполнив действие над моделью, затем считывает новое состояние из модели и записывает состояние в ViewModel .Привязка обеспечивает синхронизацию представления.
Таким образом, в вашем случае Presenter может подписаться на событие CollectionChanged
на ObservableCollection
в ViewModel, и при его изменении он реагирует насобытие, позвонив Add на модель.С другой стороны, когда докладчик обрабатывает какое-то другое пользовательское действие, которое вызывает Add для модели (он знает, потому что он обрабатывает все взаимодействие с моделью), то он знает, что ему нужно распространить это изменение наObservableCollection
в ViewModel.
В моем коде я упростил ситуацию ... после того, как каждое пользовательское действие выполняется на модели ведущим, я делаю прямую копиювсе соответствующие состояния в модели для соответствующего места во ViewModel.Вы выполняете немного больше работы, чем нужно, но в типичных приложениях типа CRUD заметных проблем с производительностью нет.Если у меня действительно большая коллекция объектов, производительность может быть проблемой, и там я перехожу к более детальной синхронизации (обновление только измененной сущности) за счет более сложной логики.