Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVM从视图模型获取父对象_C#_.net_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

C# WPF MVVM从视图模型获取父对象

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=我自己没有答案,但这里有一些链接,指向我最近一直在寻找的可能有用的东西。我也会对其他人的建议感兴趣 据我所知,关键是,如果可能,您不应该从视图模型中创建视图,因此您需要一种以松散耦合方式传达所需内容的方法 在我看来,打开新窗口是视图的责

在MVVM WPF应用程序中

如何从
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();
   }
}