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:
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); }
}