【问题标题】:How to open/show a new window in MVVM using mediator pattern?如何使用中介模式在 MVVM 中打开/显示新窗口?
【发布时间】:2011-03-05 00:52:20
【问题描述】:

我对 WPF 和 MVVM 范式非常陌生,我正在努力吸收它。我遇到的问题看起来很多 MVVM 初学者都面临同样的问题,而且似乎没有简单的方法。因此,为了使问题域保持简单,这里只是一项实验性工作。

我有一个主窗口,上面有一个“新建”按钮。当我单击此按钮时,我想显示一个 NewWindow.xaml 的实例。如何从 MainWindowViewModel 执行此操作?中介者模式有帮助吗?请提出任何好的实施参考。

我在 MainWindow 上还有一个“关闭”按钮,我想在单击此按钮时退出应用程序。我再次需要帮助:(

【问题讨论】:

    标签: mvvm window modal-dialog viewmodel


    【解决方案1】:

    前段时间我确实遇到过同样的问题。

    至少我使用了一种非常简单的方法并且我很满意。 here 是我的解决方案。

    在您的视图模型中,您只需编写一行代码:

    var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", newdialogwindowVMgoeshere);
    //do what you want with the dialogresult
    

    【讨论】:

      【解决方案2】:

      我将对话框代码放入 View 的 CodeBehind 中。我仍然通过 ViewModel 路由命令,但是 ViewModel 调用 View 的实现并获得结果。

      假设我有 MainWindow View (xaml) 和 MainWindow ViewModel,我想保存一个文件。

      在代码隐藏视图 (MainWindow.xaml.cs) 中,我添加代码以创建对话框并返回保存文件名:

          public FileInfo OpenSaveFileDialog(string title, string filter)
          {
              var dialog = new SaveFileDialog
              {
                  Filter = filter,
                  Title = title
              };
      
              var result = dialog.ShowDialog();
              if (!result.Value) return null;
      
              return new FileInfo(dialog.FileName);
          }
      

      在 ViewModel 我有一个 DoSaveFile() 方法:

          public void DoSaveFile()
          {
              var file = OpenSaveFileDialog("Save File", "Super files (*.super)|*.super |All files (*.*)|*.*");
              if (file == null) return;
              //Save logic...
           }
      
          public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }
      

      在 MainWindow.xaml 中,我有一个绑定到委托命令的按钮:

          <Button Content="Save File" Command="{Binding SaveFile}"/>
      

      与 MVP 一样,这个实现很健谈,但它非常适合测试和关注点分离。对我来说,将窗口打开机制留给 View 类是有意义的,即使它感觉有点像活动视图。

      【讨论】:

      • ViewModel如何引用视图,从而调用视图实例中的公共成员(OpenSaveFileDialog)?
      • 我认为 viewmodel 会得到类似 IView 接口的东西作为构造函数参数。 View 当然实现 IView 并作为 IView 传递给 viewmodel
      • 我也在寻找一种好的模式来显示 ViewModel 的另一个窗口。但我认为你的解决方案不好。 ViewModel 不应该对 View 有任何了解。最好 ViewModel 暴露一个事件,View 处理它以显示新窗口。
      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多