C# EventHandler invoke in class A, action to run in class B

48 Views Asked by At

I have implemented an eventhandler that should be invoked when "OpenProject" is completed. The event is listened from another class. What I see testing the code is that the "work inside" text in "HandleProjectViewModel" class is printed which means that the event is invoked and listened inside the same class; however, in "MainWindow" class the "work outside" message is not printed.

I checked on the internet how to implement the eventhandler and tried to write the code in the same way....it seems I am missing something.

Here the code (I removed part of it that does not affect the eventhandler functionality to make it easier to read).

using System;
using System.IO;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using Microsoft.Win32;
using TiaOpennessTool.Global;
using Siemens.Engineering;

namespace TiaOpennessTool.F1
{
    internal class HandleProjectViewModel : INotifyPropertyChanged
    {
        // Event handler for property changes
        public event PropertyChangedEventHandler PropertyChanged;

        public ICommand OpenCommand { get; }

        // Event for notifying popup results
        public event EventHandler<bool> PopupResult;

        // Method to handle property changes
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        // Current project instance
        private Project _project;

        // Property for the current project (read-only)
        public Project Project
        {
            get { return _project; }
            set { }
        }

        public event EventHandler<ProjectOpenedEventArgs> ProjectOpenedEvent;

        public class ProjectOpenedEventArgs : EventArgs
        {
            public Project Project { get; }

            public ProjectOpenedEventArgs(Project project)
            {
                Project = project;
            }
        }


        // Constructor for the view model
        public HandleProjectViewModel()
        {            
            OpenCommand = new RelayCommand(OpenProject);
            ProjectOpenedEvent += ProjectOpened;
        }

        private void ProjectOpened(object sender, ProjectOpenedEventArgs e)
        {
            GlobalLog.Instance.AddLogMessage("work inside");
        }


        // Method to open a project
        private void OpenProject(object obj)
        {
            GlobalLog.Instance.AddLogMessage("The project has been opened.");

            ProjectOpenedEvent?.Invoke(this, new ProjectOpenedEventArgs(_project));
        }


    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using TiaOpennessTool.F1;
using TiaOpennessTool.Global;
using Siemens.Engineering;
using TiaOpennessTool.F2;

namespace TiaOpennessTool
{
    public partial class MainWindow : Window
    {
        private HandleProjectViewModel _projectVM;
        private CompileViewModel _compileVM;

        public MainWindow()
        {
            InitializeComponent();

            _projectVM = new HandleProjectViewModel();
            _projectVM.ProjectOpenedEvent += _projectVM_ProjectOpened;
            
        }

        private void _projectVM_ProjectOpened(object sender, HandleProjectViewModel.ProjectOpenedEventArgs e)
        {
            _compileVM = new CompileViewModel(e.Project);
            GlobalLog.Instance.AddLogMessage("Work outside");
        }
    }
}

I am expecting to raise the function "_projectVM_ProjectOpened" in "MainWindow" class once the event "ProjectOpenedEvent" is invoked.

Any tip or help is appreciated.

Thank you.

0

There are 0 best solutions below