using OwlCore.Extensions; using StrixMusic.Sdk.MediaPlayback; using StrixMusic.Sdk.ViewModels; using StrixMusic.Sdk.WinUI.Controls.Items.Abstract; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace StrixMusic.Sdk.WinUI.Controls.Items { /// /// A Templated for showing an in a list. /// public partial class TrackItem : ItemControl { /// /// Initializes a new instance of the class. /// public TrackItem() { DefaultStyleKey = typeof(TrackItem); } /// /// Backing dependency property for . /// public static readonly DependencyProperty TrackProperty = DependencyProperty.Register(nameof(Track), typeof(TrackViewModel), typeof(TrackItem), new PropertyMetadata(null, (d, e) => d.Cast().OnTrackChanged((TrackViewModel?)e.OldValue, (TrackViewModel)e.NewValue))); /// /// The track to display. /// public TrackViewModel Track { get { return (TrackViewModel)GetValue(TrackProperty); } set { SetValue(TrackProperty, value); } } /// protected override void OnApplyTemplate() { base.OnApplyTemplate(); AttachHandlers(); } private void AttachHandlers() { Unloaded += TrackItem_Unloaded; } private void DetachHandlers() { Unloaded -= TrackItem_Unloaded; if (!(Track is null)) Track.PlaybackStateChanged -= OnPlaybackStateChanged; } private void TrackItem_Unloaded(object sender, RoutedEventArgs e) => DetachHandlers(); private void OnTrackChanged(TrackViewModel? oldValue, TrackViewModel newValue) { if (oldValue != null) oldValue.PlaybackStateChanged -= OnPlaybackStateChanged; if (!(newValue is null)) { newValue.PlaybackStateChanged += OnPlaybackStateChanged; PlaybackState = newValue.PlaybackState; } } private void OnPlaybackStateChanged(object sender, PlaybackState e) { PlaybackState = e; } } }