【问题标题】:Open other window from window从窗口打开其他窗口
【发布时间】:2014-08-07 10:06:54
【问题描述】:

我在这里有一些学术问题。我读了这个问题WPF MVVM Get Parent from VIEW MODEL 并得出结论ViewModel 本身不应打开任何窗口。所以我现在使用Messenger 将消息发送到ViewModelWindowWindow 打开其他窗口-NewWindow。它工作正常,但是如果NewWindow 做了一些事情并得到一些Result 必须在MainWindow 中传递以进行进一步的操作怎么办?更详细:

  1. NewWindow 通过在Window (OpenNewWindowCommand) 中单击按钮打开并进行了一些计算。
  2. 经过计算 NewWindow 得到一些 Result(不管它到底是什么)并引发相应的事件 - GotSomeResult,其中事件 arg 是 Result
  3. 这个Result 必须传入MainWindow 以进一步处理,所以我将事件处理程序绑定到GotSomeResult 事件。

您可以在下面看到说明此场景所需的所有代码。

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();

}

主窗口视图模型:

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; --- 这个字符串对我来说似乎有问题。在View 中访问ViewModel 的公共方法是否正确?是不是暴力MVVM模式?

【问题讨论】:

标签: wpf mvvm window


【解决方案1】:

为什么不在VM级别将处理程序挂钩到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();
}

【讨论】:

  • 嗯,你是对的,这是更好的解决方案。我想在View 中引用ViewModel - 坏主意。你证实了我的猜想。但是那个标准的字符串呢? DataContext = new MainWindowViewModel();它也引用了ViewModel。没有?
  • 肯定是引用MainWindowViewModel
  • 那么在View 中引用其他ViewModels 有什么问题?并调用那些ViewModels 的方法?
  • 应尽可能避免提及任何内容。为了低coupling
  • 如果我从MainViewMainViewModel 删除对ViewModels 的引用,无论如何我都会有这些引用,但只是在其他地方(在MainViewModel,而不是在View )。问题是 - 为什么我应该避免在View 中而不是在ViewModel 中引用。希望我的坏English 很好,我解释清楚。对不起,如果问题看起来很愚蠢:)
猜你喜欢
  • 2013-04-29
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多