如何使用MVVM Light Toolkit打开一个新窗口

nab*_*rid 46 wpf mvvm mvvm-light

我在我的WPF应用程序中使用MVVM Light工具包.我想知道从现有窗口打开新窗口的最佳方法是什么.我有这个MainViewModel,负责MainWindow我的申请.现在,MainView按下按钮,我想打开它上面的第二个窗口.我有RelayCommmand绑定到ButtonCommand.在RelayCommand方法中,我可以创建一个新的窗口对象,只需调用Show(),如下所示:

var view2 = new view2()
view2.Show()
Run Code Online (Sandbox Code Playgroud)

但我不认为ViewModel应该负责创建新view2对象.我已经阅读了这篇文章WPF MVVM从VIEW MODEL获取Parent,其中Bugnion建议将消息​​传递给view1from viewmodel1,然后view1应该创建新的view2.但是我不确定他将这条消息传递给他的意思是view1什么?如何view1处理消息?在它的代码背后或什么?

此致,Nabeel

Mat*_*sto 56

将消息从ViewModel1传递到View1意味着使用MVVM Light Toolkit中消息传递功能.

例如,您的ViewModel1可能有一个名为ShowView2Command的命令,然后它会发送一条消息来显示视图.

public class ViewModel1 : ViewModelBase
{
    public RelayCommand ShowView2Command { private set; get; }

    public ViewModel1() : base()
    {
        ShowView2Command = new RelayCommand(ShowView2CommandExecute);
    }

    public void ShowView2CommandExecute()
    {
        Messenger.Default.Send(new NotificationMessage("ShowView2"));
    }
}
Run Code Online (Sandbox Code Playgroud)

View1将注册接收其后面的代码中的消息,并在收到正确的消息时显示View2.

public partial class View1 : UserControl
{
    public View1()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage msg)
    {
        if (msg.Notification == "ShowView2")
        {
            var view2 = new view2();
            view2.Show();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我见过人们使用的另一种方法是使用用于打开视图的类的服务样式.您的ViewModel将使用此服务的接口来显示ChildWindow,MessageBox或其他任何内容.对于那些在视图代码隐藏中需要零代码的人来说,这是一个特别喜欢的.此外,它更易于测试,因为您可以模拟服务并声明调用显示视图的方法. (10认同)
  • 是的我见过人们也在谈论它.但是我在这种方法中不明白的是,当你使用某些服务从视图模型打开子窗口时,可以说是IDialogService.OpenChild(),你将如何设置子窗口的所有者,就像调用IDialogService的viewmodel一样. OpenChild()不知道或有自己的视图引用? (2认同)
  • 那么为什么需要设置子窗口的所有权有多种原因.拥有关系强制执行某些行为,包括最小化,最大化和恢复等(http://msdn.microsoft.com/en-us/library/system.windows.window.owner.aspx).至于使用RootVisual,这又意味着向视图发送消息,因为rootvisual可以在代码隐藏中访问,而不是在viewmodel中访问? (2认同)
  • 这很酷,但与此同时,它让我想起MFC,大约在1997年使用Message Pumps ...... (2认同)