我有我的 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
链接的新 View 和 ViewModel 对和设置DataContext="{Binding NewView, Source={StaticResource Locator}}"
在 NewView.xml
?
最佳答案
使用窗口服务:
MVVM show new window from VM when seperated projects
您可以使用 IWindowService
注入(inject) View 模型。实现或使用静态 WindowService
类(class):
public static class WindowService
{
public static void OpenWindow()
{
NewView view = new NewView();
view.Show();
}
}
依赖注入(inject)显然更适合对
IWindowService
的 View 模型和切换实现进行单元测试。在运行时。
关于c# - 使用 MvvmLight.Messaging.Messenger 实例化新的 View + ViewModel (Window),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60339949/