Я пишу довольно крупномасштабное настольное приложение WPF с использованием шаблона MVVM. Я какое-то время застревал при обновлении моих общих свойств в представлении, отличном от того, которое его обновляло.
У меня есть RibbonWindow MainView
, содержащий ContentControl
, который отображает оставшиеся представления по одному, в зависимости от выбора пользователя. У меня есть класс BaseViewModel
, который расширяют все модели представления. Среди прочего, этот класс предоставляет интерфейс INotifyPropertyChanged и содержит свойство static
типа CommonDataStore
. Этот класс также реализует интерфейс INotifyPropertyChanged и содержит свойства, которые должны быть доступны для каждой ViewModel.
Теперь, хотя я могу получить доступ и успешно обновить свойства CommonDataStore
из любой модели ViewModel, проблема в том, что WPF Framework будет уведомлять только те свойства, которые были изменены в текущем представлении. Следовательно, хотя общие значения были обновлены в других моделях представления, связанные с ними представления не обновляются.
Одним из примеров из моего приложения является экран входа в систему: когда пользователь входит в систему, мой LogInView обновляется новой информацией (то есть полным именем) из базы данных, а данные пользователя в MainView - нет.
Прочитав несколько других сообщений, я также попытался реализовать класс CommonDataStore
как синглтон, но это не помогло. Я также мог бы просто передать ссылку на этот общий объект данных конструктору каждой ViewModel из MainViewModel
, но я не уверен, что это правильный путь.
Я также обнаружил, что в WPF свойства static
обрабатываются как постоянные значения. Кажется, они просто прочитали значение один раз.
В любом случае ясно, что все мои попытки провалились. Мне было интересно, что это был за стандартный способ? В частности, мне нужно иметь возможность выполнять привязку к общим свойствам и обновлять все мои ViewModels и Views при изменении любого общего значения. Любая помощь будет принята с благодарностью. Спасибо заранее.
Edit >> Действительно? Никто не использует переменные всего приложения в приложении MVVM WPF?
Я удалил статическую часть объявления общего свойства и просто передаю копию в каждую ViewModel индивидуально. Кажется, это работает, но мне очень хотелось бы знать, как другие подходят к этой ситуации. Пожалуйста, ответьте, просто сообщив мне, как вы организуете данные в масштабе всего приложения.
Text="{Binding Common.CurrentEmployee.Name}"
.Common
- свойство базового класса, а CurrentEmployee - свойство классаCommonDataStore
. Я не могу опубликовать весь свой связанный код - его слишком много. Я спрашиваю, как другие люди этого достигают, а не прошу специально исправлять мой код. - person Sheridan   schedule 03.05.2011Common
равноstatic
, так что да, оно используется всеми моделями просмотра. В моих представлениях нет необходимости вTwo-Way
привязке ... при входе в систему используетсяCommand
, который вызывает метод вLogInViewModel
. Этот метод регистрирует пользователя и извлекает данные о пользователе из базы данных. Он обновляет общий объект, но толькоLogInView
обновляется с подробностями. Все свойства вCommonDataStore
вызывают системуINotifyPropertyChanged
, но свойствоCommon
вBaseViewModel
не может, потому что оно статично. Я также обернул его нестатическим методом, который вызвал Notify ... без помощи. - person Sheridan   schedule 03.05.2011