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