Начнем с того, что давайте сделаем несколько ярлыков о том, что вы здесь делаете: DB_USER
- это ваша модель, а User
- это ваша модель представления (я бы предпочел UserViewModel
для последней, чтобы было более понятно, что происходит. на).
Одна вещь, которая сразу становится очевидной, это то, что для вашей ViewModel не совсем правильно иметь функциональность, подходящую для вашей модели, то есть, что DataContext
не относится к тому месту, где он находится в данный момент. Это часть информации, которая должна быть либо в вашей модели, либо альтернативно инкапсулирована в некоторый класс DataStore
/ DataService
(на ваш выбор). Тогда ваша ViewModel будет ответственна, когда придет время сохранять любые изменения, чтобы сообщить DataStore
«вот обновленный снимок этой модели, пожалуйста, сохраните его для меня» (это, скорее всего, будет доступно пользовательскому интерфейсу через ICommand
). Это выглядит чище и подчеркивает идею о том, что ваша ViewModel - это слой, который адаптирует реалии вашей модели к выбранному вами интерфейсу.
Кроме вышесказанного, в том, что вы описываете, нет ничего, что, по моему мнению, нуждается в "исправлении". Тем не менее, я могу предложить несколько советов относительно того, о чем вы не разработали.
Предоставление данных из модели через ViewModel всегда можно реализовать разными способами. При рассмотрении того, какой подход выбрать, вы должны принять во внимание возможность того, что одна и та же модель будет представлена в разных представлениях одновременно. В этом случае, IMHO, предпочтительный подход состоит в том, чтобы иметь отдельную ViewModel для каждого View (представления могут быть разных типов, поэтому они могут иметь разные ожидания от адаптера ViewModel, указывая, таким образом, на несколько типов ViewModel), так что вы потребуется использовать шаблон, который позволяет передавать изменения из одной ViewModel в другие в «реальном времени».
Один из способов сделать это состоит в том, чтобы заставить ваши Модели реализовать INotifyPropertyChanged
самим, и каждый ViewModel подключается к своей Модели для уведомлений, поэтому, когда происходит изменение, ViewModel A передает изменение в Модель, и Модель уведомляет ViewModel B .
Однако лично мне не нравится загрязнять мои Модели тем, что по сути является кодом, который обслуживает только потребности пользовательского интерфейса, поэтому необходим другой подход. Это означало бы, что DataService
, о котором я упоминал выше, предоставляет функциональность (методы и события), с помощью которой ViewModel A может сообщить службе «эй, модель, которую я упаковываю, имеет некоторые изменения»; обратите внимание, что это отличается от "Я хочу, чтобы вы сохранили текущий снимок этой модели". ViewModel B уже подключен к подходящему событию ModelChanged, поэтому он получает уведомление и получает обновленную информацию из службы. Это дает дополнительное преимущество, заключающееся в том, что если в любое время служба обнаружит, что хранилище данных базы данных было обновлено источником, внешним по отношению к текущему процессу, существует готовый механизм для передачи «Вызов всех моделей представления: модель X была обновлена, любой заинтересованные стороны, пожалуйста, поговорите со мной об изучении деталей "сообщение.
Прежде всего, всегда имейте в виду, что не существует «единого истинного стиля MVVM» и существует множество возможных подходов. Какой из них выбрать, зависит не только от неопровержимых фактов и текущей позиции ползунка по шкале YAGNI / HyperEngineering, но и, скажем так, от вашего вкуса .