Не синглтон ViewModel и все еще синхронизируется - PullRequest
0 голосов
/ 05 июня 2011

Я хотел бы иметь два (или даже больше) разных окон WPF (использующих MVVM!), Но привязанных к одному и тому же типу ViewModel. Но главное, что мне нужно, чтобы эти два окна имели синхронизированный контент, в обоих из которых отображается одна и та же наблюдаемая коллекция.Мне сказали, что одноэлементные ViewModels - ужасный дизайн.

Итак, какова лучшая стратегия, где и когда назначать текстовый текст и где создавать ViewModels для решения этого сценария?

1 Ответ

4 голосов
/ 05 июня 2011

ViewModels может иметь свойства, представляющие другие ViewModels.Представление для внешней ViewModel может иметь ContentControl, привязанное к внутренней ViewModel.

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

Но я думаю, что обычно люди проверяют сами данные (Модели)являются общими, если вообще используются, а не ViewModels, так как ViewModels имеют тенденцию инкапсулировать поведение в дополнение к данным, и вы должны быть очень осторожны с действием в одном окне, которое точно так же, как и в другом окне.Это несет в себе высокий риск запутать пользователя из-за неожиданных побочных эффектов.

Что касается того, как сделать это проще, если вы не используете инфраструктуру MVVM, вы можете попробовать ее. MVVM Light как хороший вариант, если вы не использовали его, хотя я лично использую Caliburn Micro .MVVM Light имеет шаблон для ViewModelLocator, который вы можете использовать для управления созданием / ссылкой ViewModel, и вы в основном редактируете / добавляете ViewModelLocator самостоятельно.Оба хорошо работают с контейнерами IOC, что даст вам более полный контроль над созданием ViewModel.

Например, каждый раз, когда открывается новое окно для внешней ViewModel, вы регистрируете эту ViewModel в контейнере IOC, так чтоновый экземпляр создается каждый раз.И когда внешнему ViewModel требуется экземпляр внутреннего ViewModel, вы регистрируете один экземпляр в контейнере, который возвращается для этого, а не новый экземпляр, создаваемый каждый раз.(Независимо от того, происходит ли это с использованием контейнера IOC в качестве локатора служб или как фактическое внедрение зависимостей, зависит только от вас.)

Эта статья также может представлять интерес.

Пожалуйста, прокомментируйте, если вам нужно что-то прояснить относительно вашего первоначального вопроса, так как он был немного широким.Есть просто много способов сделать то, что вы хотите сделать.

...