C# WPF MVVM从视图模型获取父对象
在MVVM WPF应用程序中 如何从C# WPF MVVM从视图模型获取父对象,c#,.net,wpf,mvvm,mvvm-light,C#,.net,Wpf,Mvvm,Mvvm Light,在MVVM WPF应用程序中 如何从ViewModel设置第二个windows父级 view2.Show() 例如: view1--viewModel1 viewModel1的命令调用: var view2 = new view2 view2.Owner=我自己没有答案,但这里有一些链接,指向我最近一直在寻找的可能有用的东西。我也会对其他人的建议感兴趣 据我所知,关键是,如果可能,您不应该从视图模型中创建视图,因此您需要一种以松散耦合方式传达所需内容的方法 在我看来,打开新窗口是视图的责
ViewModel
设置第二个windows父级
view2.Show()
例如:
view1
--viewModel1
viewModel1
的命令调用:
var view2 = new view2
view2.Owner
=我自己没有答案,但这里有一些链接,指向我最近一直在寻找的可能有用的东西。我也会对其他人的建议感兴趣
据我所知,关键是,如果可能,您不应该从视图模型中创建视图,因此您需要一种以松散耦合方式传达所需内容的方法
在我看来,打开新窗口是视图的责任,而不是ViewModel的责任。就我个人而言,我会使用与显示对话框相同的方法(本论坛已经讨论了这一点): 让ViewModel向视图发送一条消息,请求它打开一个新窗口。 (或者)使用IDialogService或任何您想调用它并传递给ViewModel构造函数的东西。此服务将负责打开窗口(或将此任务委托给视图)。 这样,您可以保持关注点的清晰分离,并且您的VM保持可测试性(您可以单元测试打开新窗口的请求是否已发送,但无法测试窗口是否确实已打开) 这有意义吗 干杯
Laurent您可以这样做,就像您需要创建一些事件并在视图中注册这些事件,然后在视图模型中调用这些事件,然后打开弹出窗口一样 比如这个例子
public class Mainclass : MainView
{
public delegate abc RegisterPopUp(abc A);
public RegisterPopUp POpUpEvent;
public RelayCommand ShowCommand { private set; get; }
public void ShowCommand()
{
ShowCommand("Your parameter");
}
}
视野之内
MainView mn = new MainView();
在此处注册事件,如
mn.POpUpEvent+=
,然后双击tab按钮,然后在registers popup method中编写打开弹出窗口的代码。从viewmodel调用
Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));
Prism事件聚合器是一种很好的方法,在这里我们可以创建独立的模块,而无需依赖。首先viewmodel将发布事件,然后另一个视图或视图或viewmodel可以从事件聚合器订阅该事件
在这种情况下,Unity容器还可以使用依赖项注入将一个viewmodel注入到另一个viewmodel。嗨,Laurent,我应该如何将消息从ViewModel1发送到View1,以打开新的View2?您的意思是消息将在视图1的代码隐藏中接收吗?因为我认为消息应该发生在mvvm中的viewmodels之间。还是我完全错了。很抱歉,我是mvvm和wpf新手,我正在使用您的mvvm light toolkit。当使用IDialogService打开新窗口时,如何设置新窗口/view2的所有者属性,因为我需要引用window1/view1,而viewmodel1不包含对view1的引用?因此,我认为dialogService将通过消息传递将任务委托给view1,我仍然不确定view1将如何释放消息并处理它,除非在view1 codebehind中完成。嗨,Laurent,请澄清处理ViewModel1发送的消息(将创建新的view2)的代码应该驻留在哪里?在Lbugnon的MVVM指示灯中的View1的代码隐藏?@NabeelfRand中有一个Messenger.Default.Send小问题,如果您创建了一个服务,而该服务只接收一个ViewModel,该服务将如何将所有者设置为新窗口?您好dnndeveloper,当您说您正在从viewmodel向view发送消息,告诉它显示另一个窗口时,您的意思是您正在接收该消息并在view1代码隐藏中创建/显示另一个窗口吗?NabeelFlard-是的,在代码隐藏中接收消息,然后在解析该消息后,它将显示相应的窗口。
Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);
private void ReplyToMessage(NotificationMessage msg)
{
if (msg.Notification == "Open Window")
{
SecondWindow win = new SecondWindow();
win.ShowDialog();
}
}