JohnChris
JohnChris

Reputation: 1360

Subscribing to an event of a child view - not working

Im working on a WPF app and I am trying to use the MainWindowViewModel that holds various views as a type of messenger to pass information between views:

The following is done in a child viewmodel:

public event Action<ModelObject> NameOfEvent= delegate {};

public void Open_Command()
        {
            ModelObject modelObject= RandomViewModel.ImportModelObject();
            NameOfEvent(modelObject); //event is triggered while running the app

        }

Then in the constructor of my MainWindowViewModel (the parent of the above view model) I am subscribing to the event. And Its not picking it up

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
        }

To summarise the issue. When the event is being triggered in the child view model, the parent is not executing DoSomething method, it doesnt seem to work, i cant figure out why

Upvotes: 0

Views: 145

Answers (1)

JohnChris
JohnChris

Reputation: 1360

Ok so my issue as seen from the comments above was that I had a double instance of my childViewModel, this was done as I employed two techniques that initialize view models:

1.) Setting Data Context in xaml of my view initializes a viewmodel

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

2.) Using a technique I found to initialize view-models in a MainWindowViewModel:

<Window.Resources>
        <DataTemplate DataType="{x:Type viewModel:MyViewModel}">
            <view:MyView/>
</Window.Resources>

After you initialize in your MainWindowViewModel you assign it to a Bindable Property in the constructor and add it to xaml in a Content Control

Everything I learned so far for MVVM is to use DataContext but the 2nd method is a new way I found that works very well if you are initialising your viewmodels in a MainWindowViewModel.

I got this technique off of Brian Noyes course "MVVM in depth" on pluralsight.

So after I removed the customary :

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

The solution worked, now my MainWindowViewModel holds all my viewmodels and can act as a messenger service similar to stuff that can be found in MVVM light e.t.c

Upvotes: 1

Related Questions