feat: sichtbare Seite nach eingehendem Sync automatisch neu laden

EventApplier schreibt eingehende Sync-Ereignisse absichtlich direkt auf die rohe LiteDB-Collection
(Ping-Pong-Vermeidung), benachrichtigt dabei aber kein ViewModel - eine per Sync empfangene neue
Stunde erschien bisher erst nach manuellem Neuladen (z.B. Tab-Wechsel).

Neues SyncEngine.DataChanged-Ereignis, gefeuert nach jedem Pull mit Ereignissen sowie bei einer
RemoteWon-Konfliktauflösung; SyncStatusViewModel reicht es durch. MainWindowViewModel abonniert es
und lädt ausschließlich die gerade sichtbare Seite über ihren eigenen, längst vorhandenen
Lade-Einstieg neu - keine Navigation weg von offenen Detailansichten, keine neue Lade-Logik, und
eine laufende Inline-Bearbeitung (Schülerdetail) wird nicht überschrieben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 00:18:56 +02:00
co-authored by Claude Sonnet 5
parent 979511ab6a
commit f868b3a259
6 changed files with 211 additions and 2 deletions
@@ -15,6 +15,12 @@ public partial class SyncStatusViewModel : ObservableObject
[ObservableProperty] private bool _isServerConfigured;
[ObservableProperty] private int _pendingCount;
/// <summary>Feuert, wenn ein Sync tatsächlich Daten angewendet hat (siehe SyncEngine.
/// DataChanged, TODO 10.1.11) - MainWindowViewModel nutzt das, um die gerade sichtbare Seite
/// neu zu laden, da EventApplier absichtlich an jedem ViewModel vorbei direkt auf die LiteDB
/// schreibt.</summary>
public event Action? DataChanged;
public SyncStatusViewModel(SyncEngine? engine)
{
_engine = engine;
@@ -22,6 +28,7 @@ public partial class SyncStatusViewModel : ObservableObject
if (_engine is not null)
{
_engine.StatusChanged += OnStatus;
_engine.DataChanged += () => DataChanged?.Invoke();
// SyncEngine feuert sein erstes StatusChanged bereits im eigenen Konstruktor
// (UpdateStatus) - der läuft aber schon, während wir hier noch in GetService<SyncEngine>()
// stecken, also VOR dem obigen Abonnieren. Ohne diesen Nachhol-Aufruf bliebe StatusText