C# MVVM invoke

Main window


 public MainWindow()
 {
     InitializeComponent();
     // DataContextChanged += OnDataContextChanged;
     DataContext = new MainViewModel();
     MainViewModel? wnd = DataContext as MainViewModel;
     wnd?.SendStartCamera += OnMessageReceived;
 }

  private async void OnMessageReceived(string msg)
  {
  
    _cts = new CancellationTokenSource();
    await Task.Run(() => CameraLoop(_cts.Token));
  } 
  

MVVM


 internal class MainViewModel
 {
     public ICommand StartCameraCommand { get; }

     public event Action<string>? SendStartCamera;


     public MainViewModel()
     {
         StartCameraCommand = new RelayCommand(_ => StartCamera(), _ => true);
     }

     private void StartCamera()
     {
         Console.WriteLine("ok");
         SendStartCamera?.Invoke("Hello from ViewModel!");
     }
 }
  

Autre option avec OnDataContextChanged


 public MainWindow()
 {
     InitializeComponent();
     DataContextChanged += OnDataContextChanged;
     DataContext = new MainViewModel();     
 }

 private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
 {
     if (e.OldValue is MainViewModel oldVm)
         oldVm.SendStartCamera -= OnMessageReceived;

     if (e.NewValue is MainViewModel newVm)
         newVm.SendStartCamera += OnMessageReceived;
 }