在ViewModel中设置datacontext

时间:2018-03-31 04:58:38

标签: wpf mvvm datacontext

我有一个MainWindowView,它有一个包含2列的网格,每列有1个UserControl视图。 MainWindowView构造函数创建MainWindowVM的实例,并将数据上下文设置为此新实例。

this.DataContext = new MainWindowVM(this)

现在的问题是我正在尝试将每个UserControlView的数据上下文设置为它在MainWindowVM中的相应ViewModel的实例。如何访问MainWindowVM中的UserControlView以执行此类操作

UserControl1View.DataContext= new UserControl1ViewModel()

如果我能做到这一点,它将允许我使用MainWindowVM作为一个公共中心,从2个userControls中保存各种事件订阅。

2 个答案:

答案 0 :(得分:0)

ViewModel不得依赖View,并且两者之间必须有一对一的关系。最好是使用Binding设置DataContext,如果DataContext的此设置取决于某些条件,请使用Triggers

答案 1 :(得分:0)

唐'吨 - 执行 - 即

更好的方法是在View中使用ViewModel引用。

创建一个类似于此的界面:

public interface IView<T> where T : class
{
    T ViewModel;
}

现在,您的视图必须实现该接口

public partial class MainView : Window, IView<MainViewModel>
{
    public MainViewModel ViewModel { get; set; }

在视图构造函数中注入ViewModel:

public MainView(MainViewModel vm)
{
    this.ViewModel = vm;
    this.DataContext = this.ViewModel;
    // you can create the VMs you want for the another views
    var vm1 = new UserControl1ViewModel();
    // and pass it to the UserControl1View (UserControl1View implements IView<T>
    var view1 = new UserControl1View(vm1);