Как обрабатывать привязываемые переменные приложения в приложении WPF MVVM?

Я пишу довольно крупномасштабное настольное приложение 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 индивидуально. Кажется, это работает, но мне очень хотелось бы знать, как другие подходят к этой ситуации. Пожалуйста, ответьте, просто сообщив мне, как вы организуете данные в масштабе всего приложения.


person Sheridan    schedule 02.05.2011    source источник
comment
Выложите пожалуйста код ... Как вы писали привязки?   -  person Thomas Levesque    schedule 03.05.2011
comment
Обычным способом: Text="{Binding Common.CurrentEmployee.Name}". Common - свойство базового класса, а CurrentEmployee - свойство класса CommonDataStore. Я не могу опубликовать весь свой связанный код - его слишком много. Я спрашиваю, как другие люди этого достигают, а не прошу специально исправлять мой код.   -  person Sheridan    schedule 03.05.2011
comment
Хорошо, но общий ли общий для всех экземпляров базового класса?   -  person Thomas Levesque    schedule 03.05.2011
comment
Просто из любопытства, привязываете ли вы Mode = TwoWay? Реализуют ли объекты вашей модели INotify? Или только свойства в вашей виртуальной машине?   -  person Scott Silvi    schedule 03.05.2011
comment
Свойство Common равно static, так что да, оно используется всеми моделями просмотра. В моих представлениях нет необходимости в Two-Way привязке ... при входе в систему используется Command, который вызывает метод в LogInViewModel. Этот метод регистрирует пользователя и извлекает данные о пользователе из базы данных. Он обновляет общий объект, но только LogInView обновляется с подробностями. Все свойства в CommonDataStore вызывают систему INotifyPropertyChanged, но свойство Common в BaseViewModel не может, потому что оно статично. Я также обернул его нестатическим методом, который вызвал Notify ... без помощи.   -  person Sheridan    schedule 03.05.2011
comment
Вам нужно будет опубликовать несколько примеров кода, иначе это будет нуждаться в стоге сена.   -  person kevindaub    schedule 03.05.2011


Ответы (2)


Я сделал нечто похожее на то, что вы описываете в прошлый раз. У меня есть класс SecurityContext, который содержит некоторые данные всего приложения. Один экземпляр создается при запуске приложения, а затем этот экземпляр передается конструкторам всех моделей представления посредством внедрения зависимостей. У меня есть базовый класс для ViewModels, который предоставляет этот объект через свойство обычного экземпляра (реализуя INotifyPropertyChanged).

person Mike Schenk    schedule 04.05.2011
comment
Спасибо за ответ, Майк. Я был рад получить отзывы о том, что то, что я делаю, не противоречило никаким принципам MVVM. - person Sheridan; 07.05.2011

Вы изучали возможность реализации паттерна наблюдателя? Мы сделали это с помощью IObservable и IObserver. Здесь описывается «Модель разработки IObservable / IObserver. " следующее:

Модель разработки IObservable / IObserver предоставляет альтернативу использованию адаптеров ввода и вывода в качестве производителя и потребителя источников и приемников событий. Эта модель основана на шаблоне проектирования IObservable / IObserver, в котором наблюдателем является любой объект, который желает получать уведомления при изменении состояния другого объекта, а наблюдаемым является любой объект, состояние которого может представлять интерес, и в котором другой объект может зарегистрировать интерес. Например, в приложении публикации-подписки наблюдаемый - это публикатор, а наблюдатель - это объект-подписчик. Дополнительные сведения см. В разделе «Изучение шаблона проектирования наблюдателя» на MSDN.

person JSprang    schedule 04.05.2011
comment
Спасибо за ответ. Хотя это интересно, я думаю, что паттерн Observer - это не то, что мне нужно. - person Sheridan; 07.05.2011