c# - 使用 MvvmLight.Messaging.Messenger 实例化新的 View + ViewModel (Window)

标签 c# wpf mvvm mvvm-light

我有我的 MainView和相关的 MainViewViewModelViewModelLocator 链接.

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 .

什么是实现一个简单命令的正确方法,该命令实例化并打开一个通过 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/

相关文章:

c# - Convert.ToInt32(x) 与 (int)x 相同

c# - 动态对象情况下的垃圾收集

c# - 将模块定义添加到现有模块

wpf - CommandManager.InvalidateRequerySuggested() 不够快。我能做些什么?

c# - LibUSBDotNet:使用 USB 设备一段时间后出现奇怪的错误

c# - uint 数据类型的 ODP .NET 参数问题

wpf - 将 DataGridColumn 的 Width 属性绑定(bind)到父 DataGrid 的 ActualWidth

wpf - 如何在拖放操作期间让 ItemsCollection 中的元素播放布局动画,以便为插入元素腾出空间

c# - GroupStyle 和 Expander.IsExpanded 绑定(bind)的问题

java - 具有数据绑定(bind)的 Recyclerview 无法检测 onClick 操作