PBS
PBS

Reputation: 53

Event recognition C# WPF

I got an Problem with Events. I got a first Window which looks like this:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}

Now the seconde Page don´t do very much:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for SecondPage.xaml
    /// </summary>
    public partial class SecondPage : Window
    {
        SecondPageViewModel spvm = new SecondPageViewModel();
        public SecondPage()
        {
            this.DataContext = spvm;
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            spvm.raiseEventActivate();
        }
    }
}

And at last I have the SecondPageViewModel:

namespace EventsTests
{
    public delegate void raiseEventEventHandler();

    class SecondPageViewModel 
    {
        public event raiseEventEventHandler raiseEvent;
        public void raiseEventActivate()
        {
            if(raiseEvent != null)
            {
                raiseEvent();
            }
        }
    }
}

Now I want, when I click the button on the second page, the Event is fired an the MainWindow recognise the event. With this code i get the Error:

Error 1 Cannot assign to 'RaiseEvent' because it is a 'method group'

Can someone help me? Or give me an example?

Thanks for every hint ;)

Upvotes: 1

Views: 98

Answers (2)

weston
weston

Reputation: 54781

RaiseEvent is not your event, it's a method of the Window.

I think you want to do this:

SecondPage sp = new SecondPage();
sp.raiseEvent += raiseEvent_EventHandler;    
sp.Show();

That is, register an event handler with the second page event.

Though I wouldn't advocate event handlers for this. While I don't know what you are trying to achieve I'd rather do something like pass a ViewModel object to the SecondPage and the main window can respond to state changes on that ViewModel.

In WPF, I always aim for zero code behind.

In response to discussion, how one VM could have reference to another. First pass the VM in:

SecondPageViewModel spvm;
public SecondPage(SecondPageViewModel model)
{
    spvm = model;
    this.DataContext = spvm;
    InitializeComponent();
}

Then the SecondpageVM takes a MainVM as a paramter in the constuctor:

SecondPage sp = new SecondPage(new SecondPageViewModel(mainVM));

Updates to the main model are done within the SecondPageViewModel. The second page itself has no references to it.

ThirdPage tp = new ThirdPage(new ThirdPageViewModel(spvm))

Third page VM can access main page VM via property on second page vm: spvm.MainVm

Upvotes: 3

almulo
almulo

Reputation: 4978

In MainWindow you're trying to subscribe to a Window method, instead of your raiseEvent. And certainly you don't need to instantiate another MainWindow...

Your MainWindow code should be something like this:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public void raiseEventFromSecondPage_EventHandler()
    {
         MessageBox.Show("MAINWINDOW Event Fired");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         SecondPage sp = new SecondPage();
         sp.raiseEventFromSecondPage += raiseEventFromSecondPage_EventHandler();
         sp.Show();
    }
}

You then need that SecondPage exposes the raiseEvent. This will be a different event from the one in its ViewModel, but you'll chain both.

public partial class SecondPage : Window
{
    SecondPageViewModel spvm = new SecondPageViewModel();

    public event raiseEventEventHandler raiseEventFromSecondPage;

    public SecondPage()
    {
        this.DataContext = spvm;
        spvm.raiseEvent += raiseEvent_EventHandler;
        InitializeComponent();
    }

    public void raiseEvent_EventHandler()
    {
        if (raiseEventFromSecondPage != null)
            raiseEventFromSecondPage();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        spvm.raiseEventActivate();
    }
}

Upvotes: 1

Related Questions