MVVM Pattern,ViewModel DataContext问题

Jos*_*ose 8 c# wpf datacontext mvvm viewmodel

我需要弄清楚如何在ViewModels之间进行通信.我是MVVM的新手,所以请善待.

这是一个愚蠢的例子

类定义(假设我已经在ParentViewModel中挂钩了Child.PropertyChanged事件):

public class ParentViewModel : ViewModelBase
{
    public ChildViewModel Child { get; set; }
}

public class ChildViewModel : ViewModelBase
{
    String _FirstName;
    public String FirstName 
    {
        get { return _FirstName; }
        set
        {
            _FirstName = value;
            OnPropertyChanged("FirstName");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是您在资源字典中看到的内容

<DataTemplate DataType="{x:Type vm:ParentViewModel}">
    <vw:ParentView/>
</DataTemplate>

<DataTemplate DataType="{x:Type vm:ChildViewModel}">
    <vw:ChildView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

和ChildView的代码隐藏:

public partial class ChildView : UserControl
{
    public QueueView()
    {
        InitializeComponent();
        DataContext = new ChildViewModel();
    }
}
Run Code Online (Sandbox Code Playgroud)

显而易见的问题是,当ChildView被实例化时(通过从DataTemplate中选择),它会创建一个新的ChildViewModel类,而ParentViewModel无法访问它.

那么如何将View的DataContext实例化为导致选择DataTemplate的原始ViewModel?

一个明显的解决方法是将ChildViewModel中的属性混合到ParentViewModel中,但我宁愿将其分开,因为要重用.

我确定答案是微不足道的,我只是想知道它是什么.:)

提前致谢.

Jos*_*h G 8

你应该删除该行:

DataContext = new ChildViewModel();
Run Code Online (Sandbox Code Playgroud)

DataContext视图将自动通过WPF设定.DataTemplates始终将其数据上下文设置为模板的数据(在本例中为ViewModel):

<DataTemplate DataType="{x:Type vm:ChildViewModel}">
    <vw:ChildView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

最终结果是您可以单独构建视图模型对象(父类和子类),然后通过简单地将它们插入内容控件中来显示它们.


Son*_*Ali 5

使用MVVM方法在ViewModel之间进行通信的最简单方法是使用Mediator模式(Prism中的EventAggregator).在以下链接中可以看到这种方法的一个很好的例子:

  1. Sacha Barber的MVVM中介模式
  2. marlon grech的MVVM + Mediator

另请参阅MVVM 示例项目框架.