Favoriten und Überwachung: Feature-Flags auf Serien-Covers (Teil 34)
Jede Hörspielserie in EchoPlay hat zwei unabhängige Zustände: IsFavorite und IsWatched. Der eine markiert Lieblingsserien, der andere aktiviert die Überwachung auf Neuerscheinungen. Beide werden als kleine Overlay-Buttons direkt auf dem 140×140-Cover dargestellt — ein goldener Stern oben links für Favoriten, ein weißes Auge darunter für die Überwachung.
SeriesTileControl: DependencyProperties für optionale Icons
Das wiederverwendbare SeriesTileControl kennt beide Icons als optionale Properties. In WinUI 3 verwendet man dafür DependencyProperties — das sind spezielle Properties, die das XAML-Binding-System versteht und die von außen gesetzt werden können:
// Favoriten-Stern (Toggle per Klick)
public static readonly DependencyProperty FavoriteVisibilityProperty = ...;
public static readonly DependencyProperty FavoriteGlyphProperty = ...;
public static readonly DependencyProperty FavoriteCommandProperty = ...;
// Überwachungs-Auge (nur Anzeige, kein Klick)
public static readonly DependencyProperty WatchedVisibilityProperty = ...;
public static readonly DependencyProperty WatchedGlyphProperty = ...;
In der Mediathek-Seite wird das Control dann per x:Bind an das ViewModel gebunden:
<ctrl:SeriesTileControl
FavoriteVisibility="Visible"
FavoriteGlyph="{x:Bind FavoriteGlyph, Mode=OneWay}"
FavoriteCommand="{x:Bind ToggleFavoriteCommand}"
WatchedVisibility="{x:Bind WatchedVisibility, Mode=OneWay}"
WatchedGlyph="{x:Bind WatchedGlyph, Mode=OneTime}" />
ViewModel-Pattern: Gleiche Properties, verschiedene Kontexte
Beide CardViewModels — LocalArtistCardViewModel und SeriesCardViewModel — liefern die gleichen Properties für Stern und Auge. Der Favoriten-Stern wechselt zwischen leer und gefüllt, das Überwachungs-Auge wird nur angezeigt, wenn IsWatched aktiv ist:
public string FavoriteGlyph => _isFavorite ? "uE735" : "uE734";
public string WatchedGlyph => "uE7B3";
public Visibility WatchedVisibility => _isWatched ? Visibility.Visible : Visibility.Collapsed;
Das ToggleFavoriteCommand braucht Zugriff auf ISeriesDataService, das als Scoped registriert ist. Deshalb bekommt das CardViewModel eine IServiceScopeFactory im Konstruktor übergeben — der Scope wird nur für den kurzen Moment des Toggle-Aufrufs geöffnet und sofort wieder geschlossen.
Nur-Online-Modus
Ergänzend gibt es AppSettings.OnlineOnlyMode — ein Setting, das die lokale Mediathek komplett ausblendet. Die Prüfung erfolgt in OnNavigatedTo der lokalen Mediathek-Seite, analog zur bestehenden Offline-Modus-Sperre der Online-Mediathek. Konsistenz durch ein gemeinsames Control ist der Schlüssel: Beide Mediatheken nutzen dasselbe SeriesTileControl, sodass Änderungen am Kachel-Design automatisch überall greifen.
Die gezeigten Code-Beispiele dienen zur Veranschaulichung. Nutzung auf eigene Verantwortung. Mehr dazu