gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:56:10 25 4
gpt4 key购买 nike

我有我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com