使用MvvmLight.Messaging.Messenger实例化新的View + ViewModel(窗口)

问题描述 投票:0回答:1

我有我的MainView和关联的MainViewViewModel,它们由ViewModelLocator链接。

MainViewViewModel内,有一个命令应触发一个新的Window打开,该命令具有自己的View和ViewModel(NewViewNewViewViewModel)。

[在我已经看到的许多示例中,建议使用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

实现一个简单命令实例化并打开通过ViewModelLocatorDataContext="{Binding NewView, Source={StaticResource Locator}}"中的NewView.xml设置链接的新View和ViewModel对的正确方法是什么?

c# wpf mvvm mvvm-light
1个回答
0
投票

使用窗口服务:

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时切换实现。

© www.soinside.com 2019 - 2024. All rights reserved.