Как обрабатывать привязываемые переменные всего приложения в приложении WPF MVVM? - PullRequest
2 голосов
/ 02 мая 2011

Я пишу довольно масштабное настольное WPF-приложение с использованием шаблона MVVM. Я застрял на некоторое время, когда мои общие свойства обновлялись в представлении, отличном от того, в котором он обновлялся.

У меня есть RibbonWindow MainView, который содержит ContentControl, который отображает оставшиеся просмотры по одному в зависимости от выбора пользователя. У меня есть BaseViewModel класс, который расширяет все ViewModels. Помимо прочего, этот класс предоставляет интерфейс INotifyPropertyChanged и содержит свойство static типа CommonDataStore. Этот класс также реализует интерфейс INotifyPropertyChanged и содержит свойства, которые должны быть доступны каждому ViewModel.

Теперь, хотя я могу получить доступ и успешно обновить свойства CommonDataStore из любой ViewModel, проблема в том, что WPF Framework будет уведомлять только те свойства, которые изменились в текущем представлении. Поэтому, хотя общие значения были обновлены в других моделях представления, их связанные представления не обновляются.

Одним из примеров из моего приложения является экран входа в систему: когда пользователь входит в систему, мой LogInView обновляется новой информацией (т.е. полным именем) из базы данных, но данные пользователя в MainView не отображаются.

Прочитав несколько других постов, я также попытался реализовать класс CommonDataStore как Singleton, но это не помогло. Я мог бы также просто передать ссылку на этот общий объект данных в конструктор каждой модели представления из MainViewModel, но я не уверен, что это правильный путь.

Я также обнаружил, что в WPF свойства static обрабатываются как постоянные значения. Кажется, они просто прочитали значение один раз.

Так что, в любом случае, все мои попытки провалились. Мне было интересно, что стандартный способ сделать это? В частности, мне нужно иметь возможность связываться с общими свойствами и обновлять все мои ViewModels и Views при изменении любого общего значения. Любая помощь будет принята с благодарностью. Большое спасибо заранее.

Редактировать >> Действительно? Никто не использует переменные всего приложения в приложении MVFM WPF?

Я удалил статическую часть объявления свойства Common и просто передаю копию в каждую ViewModel по отдельности. Кажется, это работает, но мне бы очень хотелось узнать, как другие подходят к этой ситуации. Пожалуйста, ответьте, просто дайте мне знать, как вы организуете данные этого приложения.

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

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

0 голосов
/ 04 мая 2011

Рассматривали ли вы реализацию шаблона наблюдателя? Мы сделали это с IObservable и IObserver . Это описывает «Модель разработки IObservable / IObserver» следующим образом:

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

...