Как передать модель представления в пользовательских аргументах событий - PullRequest
2 голосов
/ 02 апреля 2012

Я использую каркас Caliburn Micro.Это на самом деле не имеет значения.Дело в том, что я публикую событие в модели представления, которая содержит новую модель представления, которая будет отображаться в ее аргументах события.Событие перехватывается в ShellViewModel (вы можете видеть его как модель корневого представления), которая фактически активирует новую модель представления.

Итак, как я могу передать модель представления в мои аргументы событий?В настоящее время это выглядит так:

// where it gets published; "AnotherViewModel" is the actual class
public void AMethod()
{
    var args = new ViewModelChangedEventArgs { ViewModelType = typeof(AnotherViewModel) };
    PublishEvent(args);
}

// event handler
public void Handle(ViewModelChangedEventArgs message)
{  
    if (message.ViewModelType == typeof(AnotherViewModel))
    {
        // activate AnotherViewModel
    }
    if (message.ViewModelType == typeof(FooViewModel))
    {
        // activate FooViewModel
    }
}

Этот метод кажется мне не очень элегантным.У вас есть идеи получше?

1 Ответ

2 голосов
/ 02 апреля 2012

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

public void Handle(ViewModelChangedEventArgs message)
{  
    var viewModel = viewModelFactory.Create(typeof(AnotherViewModel));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...