如何通过 View 模型命令打开新的 View (对话框),以及如何使用其 View 模型设置新 View 的数据上下文。这个问题困扰着我很多,尽管对此有很多问题,但是到目前为止,我对任何答案都不满意。

因此,假设:

我有一个名为MainView的启动对话框,并显示此对话框并在App.xaml.cs(OnStartUp)方法中设置其数据上下文。在MainView中,有一个名为“打开新对话框”的按钮,此按钮的命令与MainViewModel中的委托(delegate)命令绑定(bind)。因此,当用户按下此按钮时,命令将调用execute方法。
假设在MainViewModel中与 View 中的按钮绑定(bind)的命令如下

  public ICommand ShowNewDialogCommand
    {
       if(this._showNewDialogCommand == null)
        {
          this._showNewDialgoCommand = new DelegateCommand(ShowDialogFromVM);
        }
    }
    private void ShowDialogFromVM()
    {
    }

假设我要显示的新对话框是ListAllStudentsView,其ViewModel是StudentsViewModel。那么,在不破坏MVVM模式的情况下显示此对话框的各种方法有哪些?每种方法的优点和缺点是什么?

最佳答案

首先,我们需要使用其数据上下文集创建一个 View (在某处)。很容易,我们实例化 View ,然后将其传递给 View 模型(假设 View 在其构造函数中设置了它的数据上下文)或手动设置了它。如果需要, View 也可以在XAML中声明 View 模型。

方法1:

Window dialog = new ListAllStudentsView(new StudentsViewModel());

方法2:
Window dialog = new ListAllStudentsView();
dialog.DataContext = new StudentsViewModel();

方法3:
<Window.DataContext>
   <local:StudentsViewModel/>
</Window.DataContext>

现在,我们需要将此代码(以及相关的dialog.ShowDialog()放置在某处)。我在命令的execute函数中或在 View 的代码隐藏中看到了两个选项(由命令的execute函数(例如“RequestDialog”)引发的事件触发)。

我更喜欢第一个,尽管它并没有严格遵循MVVM,因为它更简单,代码更少且易于管理。但是,如果您想严格遵守MVVM,我将让ViewModel在命令函数中引发一个诸如“RequestDialog”的事件,该命令函数将 View 监听并运行构造函数和ShowDialog()函数。

10-08 11:23