我有一个MainWindowView,它有一个包含2列的网格,每列有1个UserControl视图。 MainWindowView构造函数创建MainWindowVM的实例,并将数据上下文设置为此新实例。
this.DataContext = new MainWindowVM(this)
现在的问题是我正在尝试将每个UserControlView的数据上下文设置为它在MainWindowVM中的相应ViewModel的实例。如何访问MainWindowVM中的UserControlView以执行此类操作
UserControl1View.DataContext= new UserControl1ViewModel()
如果我能做到这一点,它将允许我使用MainWindowVM作为一个公共中心,从2个userControls中保存各种事件订阅。
答案 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);