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.