Wie aktualisiert man die Daten richtig?

H

Herman

Gast
Hallo liebes Forum,
in einem MVVM dotnet Projekt habe ich folgendes Problem:
ViewModel A ändert die Datenbank auf irgendeine Weise. ViewModel B sollte seine Daten aufgrund der Datenbankänderung aktualisieren (dies wird asynchron sein, da es sich um einen Datenbankaufruf handelt).

Wie benachrichtigt ViewModel A -> ViewModel B so, dass ViewModel B seinen asynchronen Datenbankaufruf tätigen kann, um seine Daten zu aktualisieren?
Aktuell laufe ich immer in das Problem, dass ich "async void" erstellen muss, da Events und Messenger keine async Implementierung anbieten, ich aber auch
nicht ohne weiter kann, da ich einen Datenbank Aufruf machen muss.

Es sollte ja ein recht normales Problem sein, aber ich bin bisher nirgendwo auf eine Lösung gestoßen, wie man es behebt.
Vielleicht gibt es sonst auch einen ganz anderen Ansatz, der es sauber löst?



Aktuell mache ich ca. sowas hier:
C#:
CommunityToolkit.Mvvm.Messaging.Messages;

public
sealed class NotifyMessage : ValueChangedMessage<string> {
public
  NotifyMessage(string value) : base(value) {}
}

ViewModelA:
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;

public
partial class ViewModelA : ObservableObject {
public
  ViewModelA() {}

private
  void UpdateData() {
    // do stuff
    SendMessage();
  }

private
  void SendMessage() { WeakReferenceMessenger.Default.Send(new NotifyMessage("Data update in A")); }
}

ViewModelB:
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using System.Diagnostics;

public
partial class ViewModelB : ObservableObject, IRecipient<NotifyMessage>, IDisposable {
  [ObservableProperty] private string _lastMessage = "B";

public
  ViewModelB() { WeakReferenceMessenger.Default.Register<NotifyMessage>(this); }

public
  async void Receive(NotifyMessage message) {
    LastMessage = message.Value;
    try {
      await RefreshData();
    } catch (Exception e) {
      Console.WriteLine("ERROR: " + e.Message);
    }
  }

private
  async Task RefreshData() {
    await Task.Delay(1000);
    Console.WriteLine(LastMessage);
  }

public
  void Dispose() { WeakReferenceMessenger.Default.Unregister<NotifyMessage>(this); }
}
 
Zurück
Oben Unten