如何通过 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()函数。