我使用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
}
}
这种方法在我看来不太优雅。你有更好的主意吗?
总体解决方案非常好,您只需在事件参数中传递一个元信息,就足以创建一个新的ViewModel。关于ViewModel创建本身,这是一个标准的设计问题,可以通过实现Factory模式来解决。基本上,您需要一个能够按类型创建具体ViewModel的工厂,因此您的处理程序代码如下所示:
public void Handle(ViewModelChangedEventArgs message)
{
var viewModel = viewModelFactory.Create(typeof(AnotherViewModel));
}