我正在开发一个WPF应用程序,我正在尝试使用MainWindowViewModel将各种视图作为一种信使来传递视图之间的信息:
以下是在子视图模型中完成的:
public event Action<ModelObject> NameOfEvent= delegate {};
public void Open_Command()
{
ModelObject modelObject= RandomViewModel.ImportModelObject();
NameOfEvent(modelObject); //event is triggered while running the app
}
然后在我的MainWindowViewModel(上面的视图模型的父级)的构造函数中,我订阅了该事件。它没有把它拿起来
private readonly RandomViewModel _randomViewModel = new RandomViewModel();
public MainWindowViewModel()
{
Random= _randomViewModel; // sets view model to a bindable
//property that lods the view in the main window
_randomViewModel.NameOfEvent+= DoSomething; //subscribes to childs event
}
private void DoSomething(ModelObject obj)
{
//It never reaches here
}
总结一下这个问题。当在子视图模型中触发事件时,父进程没有执行DoSomething方法,它似乎无法工作,我无法弄清楚为什么
答案 0 :(得分:1)
好的,我从上面的评论中看到的问题是我有一个childViewModel的双实例,这是在我使用两种初始化视图模型的技术时完成的:
1。)在我的视图的xaml中设置数据上下文初始化一个viewmodel
<UserControl.DataContext>
<local:MyViewModel>
</UserControl.DataContext>
2.使用我发现的技术在MainWindowViewModel中初始化视图模型:
<Window.Resources>
<DataTemplate DataType="{x:Type viewModel:MyViewModel}">
<view:MyView/>
</Window.Resources>
在MainWindowViewModel中初始化之后,将其分配给构造函数中的Bindable属性,并将其添加到Content Control
到目前为止我学习MVVM的所有内容都是使用DataContext,但第二种方法是我发现的一种新方法,如果你在MainWindowViewModel中初始化你的视图模型,它会很有效。
我从Brian Noyes的课程中获得了这种技术“在多重视觉上的MVVM深度”。
所以在我删除惯例之后:
<UserControl.DataContext>
<local:MyViewModel>
</UserControl.DataContext>
解决方案有效,现在我的MainWindowViewModel保存了我的所有视图模型,并且可以充当信使服务,类似于可以在MVVM light e.t.c中找到的东西