订阅儿童视图事件 - 不工作

时间:2017-11-10 12:15:20

标签: c# wpf

我正在开发一个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方法,它似乎无法工作,我无法弄清楚为什么

1 个答案:

答案 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

中的xaml

到目前为止我学习MVVM的所有内容都是使用DataContext,但第二种方法是我发现的一种新方法,如果你在MainWindowViewModel中初始化你的视图模型,它会很有效。

我从Brian Noyes的课程中获得了这种技术“在多重视觉上的MVVM深度”。

所以在我删除惯例之后:

<UserControl.DataContext>
 <local:MyViewModel>
</UserControl.DataContext>

解决方案有效,现在我的MainWindowViewModel保存了我的所有视图模型,并且可以充当信使服务,类似于可以在MVVM light e.t.c中找到的东西