Я пишу довольно крупномасштабное настольное приложение 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