从窗口打开其他窗口

时间:2014-06-17 11:51:07

标签: wpf mvvm window

我在这里有一些学术问题。我读了这个问题WPF MVVM Get Parent from VIEW MODEL并得出结论,ViewModel本身不应该打开任何窗口。因此,我现在使用MessengerViewModel Window发送消息,Window打开其他窗口 - NewWindow。它运行正常,但如果NewWindow执行某些操作并获得一些Result,必须在MainWindow中传递以进行进一步操作,该怎么办?更详细:

  1. NewWindow按钮点击Window(OpenNewWindowCommand)并进行了一些计算。
  2. 经过计算NewWindow得到了一些Result(确切意义到底是什么)并引发相应的事件 - GotSomeResult,其中事件arg为Result
  3. Result必须在MainWindow中传递给进一步处理,因此我将事件处理程序绑定到GotSomeResult事件。
  4. 下面您可以看到所有必需的代码来说明这种情况。

    MainWindow代码隐藏:

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    
        Messenger.Default.Register<NewWindowMessage>(this, OpenNewWindow);
    }
    
    private void OpenNewWindow(NewWindowMessage message)
    {
        var newWindow = new NewWindow();
        var newWindowViewModel = (NewWindowViewModel) message.Target;        
        newWindowViewModel.GotSomeResult += ((MetaWindowViewModel)DataContext).ProcessResult;
    
        newWindow.Owner = this;
        newWindow.DataContext = newWindowViewModel;
        newWindow.ShowDialog();
    
    }
    

    MainWindow ViewModel:

    public void OpenNewWindowCommand()
    {
        Messenger.Default.Send(new NewWindowMessage(this, new NewWindowViewModel("OpenWindow"), String.Empty));
    }
    
    public void ProcessResult(Object someResult)
    {
         // Any actions with result
    }
    

    newWindowViewModel.GotSomeResult + =((MetaWindowViewModel)DataContext).ProcessResult; ---这个字符串对我来说似乎有问题。在ViewModel中访问View的公共方法是否正确?它是暴力MVVM模式吗?

1 个答案:

答案 0 :(得分:2)

为什么不在虚拟机级别将处理程序挂钩到GotSomeResult,即:

public void OpenNewWindowCommand()
{
    var newWindowViewModel = new NewWindowMessage(this, new NewWindowViewModel("OpenWindow"), String.Empty)
    newWindowViewModel.GotSomeResult += this.ProcessResult;

    Messenger.Default.Send();
}

它删除了代码隐藏中对ViewModel的引用(确实应该避免):

private void OpenNewWindow(NewWindowMessage message)
{
    var newWindow = new NewWindow();

    newWindow.Owner = this;
    newWindow.DataContext = message.Target;
    newWindow.ShowDialog();
}