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中,但我宁愿将其分开,因为要重用.
我确定答案是微不足道的,我只是想知道它是什么.:)
提前致谢.
你应该删除该行:
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)
最终结果是您可以单独构建视图模型对象(父类和子类),然后通过简单地将它们插入内容控件中来显示它们.
使用MVVM方法在ViewModel之间进行通信的最简单方法是使用Mediator模式(Prism中的EventAggregator).在以下链接中可以看到这种方法的一个很好的例子:
另请参阅MVVM 示例项目框架.