我有我的MainView
和关联的MainViewViewModel
,它们由ViewModelLocator
链接。
在MainViewViewModel
内,有一个命令应触发一个新的Window
打开,该命令具有自己的View和ViewModel(NewView
和NewViewViewModel
)。
[在我已经看到的许多示例中,建议使用Mvvmlight的Messenger
来做类似的事情:
public class MainViewViewModel
{
private void OpenNewWindow()
{
Messenger.Default.Send(new NotificationMessage("NewView"));
}
}
然后注册NewViewViewModel
并按以下方式处理消息:
public class NewViewViewModel
{
public NewViewViewModel()
{
Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
}
private void NotificationMessageReceived(NotificationMessage obj)
{
if (obj.Notification == "NewView")
{
NewView view = new NewView();
view.Show();
}
}
}
但是,由于NewViewViewModel尚未实例化(因此未在Messenger
中注册),因此无法使用。另外,这不适用于MVVM,因为NewViewViewModel
负责创建NewView
。
实现一个简单命令实例化并打开通过ViewModelLocator
和DataContext="{Binding NewView, Source={StaticResource Locator}}"
中的NewView.xml
设置链接的新View和ViewModel对的正确方法是什么?
使用窗口服务:
MVVM show new window from VM when seperated projects
您可以通过IWindowService
实现注入视图模型,也可以使用静态WindowService
类:
public static class WindowService
{
public static void OpenWindow()
{
NewView view = new NewView();
view.Show();
}
}
显然,依赖注入更可取,因为它能够在运行时对视图模型进行单元测试并在IWindowService
时切换实现。