如何从ViewModel显示View,并在WPF中使用MVVM设置该视图的数据上下文

时间:2014-03-11 17:38:14

标签: c# .net wpf mvvm prism

如何从视图模型命令打开新视图(对话框),并使用其视图模型设置新视图的数据上下文。这个问题让我烦恼不已,虽然对此有如此多的疑问,但到目前为止我对这个答案都不满意。

所以,假设:

我有一个名为MainView的启动对话框,我显示此对话框并在App.xaml.cs(OnStartUp)方法中设置其数据上下文。在MainView中,有一个名为&#34的按钮;打开一个新对话框"此按钮的命令与MainViewModel中的委托命令绑定。因此,当用户点击此按钮时,命令会调用execute方法 让我们说MainViewModel中与视图中的按钮绑定的命令如下:

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

让我们说我要显示的新对话框是ListAllStudentsView,它的ViewModel是StudentsViewModel。那么,在不破坏MVVM模式的情况下显示此对话框的各种方法是什么?每种方法的优点和缺点是什么?

1 个答案:

答案 0 :(得分:2)

首先,我们需要使用其datacontext集创建一个视图(某处)。很简单,我们实例化视图并将视图模型传递给它(假设视图在其构造函数中设置其数据上下文)或手动设置它。如果我们愿意,视图也可以在XAML中声明视图模型。

方法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()放在某处)。我在命令的执行函数或视图的代码隐藏中看到了两个选项(由命令的执行函数引发的事件触发,如&#34; RequestDialog&#34 ;)

我更喜欢第一个,尽管它并不严格遵守MVVM,因为它更简单,代码更少,更易于管理。如果你想要非常严格地遵守MVVM,我会让ViewModel引发像&#34; RequestDialog&#34;在视图侦听的命令函数中,运行构造函数和ShowDialog()函数。