Совместное использование состояния / изменений через ViewModels - PullRequest
3 голосов
/ 11 июня 2010

У меня есть приложение, в котором есть вкладка Задачи и вкладка Проекты.Я решил создать отдельную ViewModel для каждой из вкладок TasksViewModel и ProjectsViewModel.

На вкладке «Задачи» есть новая область задач со связанным раскрывающимся списком проектов, а на вкладке «Проекты» (очевидно) есть список проектов.

Мне бы хотелось, чтобы в раскрывающемся списке на вкладке «Задачи» использовалась та же коллекция, что и в списке вкладок «Проекты», чтобы при каждом добавлении или удалении проекта на вкладке «Проекты» список на вкладке «Задачи» появлялсяна сегодняшний день автоматически.Это хорошо работало с одной ViewModel, но начинало становиться совсем неуправляемым.

Разве я не должен был разделиться на две модели ViewModel?Существует ли распространенный метод обмена данными, подобный этому?Возможно, передать одинаковые ObservableCollection<Project> в каждую из моделей ViewModels?Возможно, какой-то тип уведомлений обратно в TasksViewModel в соответствии с ICollectionChanged.

Оцените любую проницательность / ввод!

Ответы [ 2 ]

5 голосов
/ 11 июня 2010

Самым простым решением здесь часто является использование какой-либо формы службы обмена сообщениями для передачи информации между двумя моделями представления.

Например, MVVM Light Toolkit предоставляет интерфейс IMessenger для подобных ситуаций.

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

3 голосов
/ 12 июня 2010

Мне кажется, что ваши понятия "Задачи" и "Проекты" являются частью вашей модели, а не частью вашей модели представления.

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

  1. Было бы хорошо или плохо, если бы проект сразу появился в раскрывающемся списке на вкладке Задачи на экране другого пользователя?
  2. Было бы хорошо или плохо, если Проект появился в этом раскрывающемся списке после того, как первый пользователь нажал "Сохранить" или "Подтвердить" или "ОК"?

Если ответ на один из этих вопросов «хороший», ваши данные действительно являются частью вашей модели , а не модели просмотра . И с этим надо обращаться как таковым.

Ваша модель представления должна включать вашу фактическую модель в качестве ссылки, и это хорошая вещь, чтобы как можно больше делить объекты модели между моделями представления. Фактически, в идеале большая часть вашего приложения имеет один набор объектов модели. Исключением может быть диалоговое окно, в котором вы хотите внести некоторые изменения, но затем нажать «Отмена» и не сохранять их. В этом случае кнопка «ОК» скопирует данные из модели, поддерживаемой вашим диалоговым окном, в основную модель приложения. В этом случае объекты модели, используемые диалогом и основным приложением, являются разными экземплярами одного и того же класса.

Теперь давайте рассмотрим случай, когда вы ответили «плохо» на оба этих вопроса. Это будет приложение, в котором вы никогда не сохраните свой список «Проекты» обратно в основную базу данных / документ / что угодно, но это временный список, используемый только для временной работы. В этом случае это будет действительно модель представления, и я присоединяю ее к приложению (или любой другой подходящей области) и получаю к ней доступ двумя вкладками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...