MVVM: обмен данными между ViewModels

Как мне обмениваться данными между несколькими ViewModels?

Например, есть класс с именем Project в приложении.

    public class Project : ModelBase
{
    private string _projectName;

    public string ProjectName
    {
        get { return _projectName; }
        set
        {
            _projectName = value;
            RaisePropertyChanged(() => ProjectName);
        }
    }
}

В нескольких приложениях ViewModels необходимо открыть ActiveProject.
Какой лучший способ поделиться проектом между ViewModels?

  • Схема посредника? (Сообщений)
  • Статический объект
  • Синтаксический шаблон (если да, как?)

Я использовал Messaging раньше, но для этого нужно много трещин. Для всех ViewModels я должен создать свойство ActiveProject, а также зарегистрировать мессенджер, чтобы обновить его.


Я использую среду MVVM Light.
Любой пример кода будет оценен.

Ответ 1

Я бы создал ViewModel, который будет выступать в роли родителя для всех ViewModels проекта. (Позвольте назвать это Решение)

Решение ViewModel будет иметь свойство ActiveProject и наблюдаемую коллекцию проектов.

Ответ 2

Я бы рекомендовал шаблон посредника. Я использовал EventAggregator для этого типа обмена сообщениями между VM раньше, и на самом деле это не так много.

Ответ 3

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

Например, ViewModel1 (VM1) создаст проект и заполнит его. Затем VM1 помещает проект в осколок, статическую, коллекцию. Затем VM1 перейдет к другой модели представления (VM2). В конструкторе VM2 вы должны перейти к коллекции и получить проект, размещенный там VM1.

Если вы использовали словарь пар ключ-значение, он также позволит вам делиться другими данными между моделями просмотров.

Ответ 4

Синглтон определенно поможет. Для реализации, если бы у меня был класс с именем User:

    private static User mInstance;

    private User () //constructor
    {
    }

    public static User Instance
    {
        get
        {
            if (mInstance == null)
                mInstance = new User();
            return mInstance;
        }
    }

Ответ 5

Не надо, не надо. Не используйте синглтоны таким образом в своем приложении MVVM. На самом деле класс Project должен быть моделью для ваших ViewModels. Просто передайте его в конструкторе vm. Если вам действительно нужно разделить один экземпляр класса Project в нескольких виртуальных машинах, то при создании моделей просмотра используйте фабрики и кеширование определенного типа. Если ваш vm требует дополнительную информацию, просто создайте специальный класс Model, который будет выводиться из Project (или реализует IProject), поэтому вы можете легко использовать принцип сегрегации интерфейса.