diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs b/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs index e8b74947..175eb59d 100644 --- a/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs +++ b/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs @@ -1,4 +1,5 @@ -using Microsoft.UI.Xaml; +using System.Diagnostics; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Wino.Mail.ViewModels.Data; @@ -8,26 +9,6 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView { public bool IsAllSelected => Items.Count == SelectedItems.Count; - public WinoListView() - { - ChoosingItemContainer += WinoListView_ChoosingItemContainer; - } - - private void WinoListView_ChoosingItemContainer(ListViewBase sender, ChoosingItemContainerEventArgs args) - { - if (args.Item is ThreadMailItemViewModel) - { - args.ItemContainer = new WinoThreadMailItemViewModelListViewItem(); - } - else if (args.Item is MailItemViewModel) - { - args.ItemContainer = new WinoMailItemViewModelListViewItem(); - } - - // Handle the preparation in PrepareContainerForItemOverride - args.IsContainerPrepared = false; - } - protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { if (item is MailItemViewModel mailItemViewModel && element is WinoMailItemViewModelListViewItem container) @@ -45,6 +26,19 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView base.PrepareContainerForItemOverride(element, item); } + protected override void ClearContainerForItemOverride(DependencyObject element, object item) + { + if (item is IMailListItem mailListItem) + { + if (element is WinoThreadMailItemViewModelListViewItem threadMailItemViewModelListViewItem) threadMailItemViewModelListViewItem.Cleanup(); + if (element is WinoMailItemViewModelListViewItem winoMailItemViewModelListViewItem) winoMailItemViewModelListViewItem.Cleanup(); + } + + base.ClearContainerForItemOverride(element, item); + + Debug.WriteLine($"Cleaned container"); + } + public bool SelectMailItemContainer(MailItemViewModel mailItemViewModel) { WinoMailItemViewModelListViewItem? itemContainer = null; diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoMailItemViewModelListViewItem.cs b/Wino.Mail.WinUI/Controls/ListView/WinoMailItemViewModelListViewItem.cs index 4f48f901..1de331af 100644 --- a/Wino.Mail.WinUI/Controls/ListView/WinoMailItemViewModelListViewItem.cs +++ b/Wino.Mail.WinUI/Controls/ListView/WinoMailItemViewModelListViewItem.cs @@ -8,11 +8,12 @@ namespace Wino.Mail.WinUI.Controls.ListView; public partial class WinoMailItemViewModelListViewItem : ListViewItem { + private readonly long _selectionChangeCallbackToken; public WinoMailItemViewModelListViewItem() { DefaultStyleKey = typeof(WinoMailItemViewModelListViewItem); - RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged); + _selectionChangeCallbackToken = RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged); } protected override void OnContentChanged(object oldContent, object newContent) @@ -31,6 +32,16 @@ public partial class WinoMailItemViewModelListViewItem : ListViewItem } } + public void Cleanup() + { + if (Content is MailItemViewModel mailItem) + { + UnregisterSelectionCallback(mailItem); + + UnregisterPropertyChangedCallback(IsSelectedProperty, _selectionChangeCallbackToken); + } + } + private void UnregisterSelectionCallback(IMailListItem mailItem) { mailItem.PropertyChanged -= MailPropChanged; diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs b/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs index 04647157..006275da 100644 --- a/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs +++ b/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs @@ -18,9 +18,22 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem public static readonly DependencyProperty IsThreadExpandedProperty = DependencyProperty.Register(nameof(IsThreadExpanded), typeof(bool), typeof(WinoThreadMailItemViewModelListViewItem), new PropertyMetadata(false, new PropertyChangedCallback(OnIsThreadExpandedChanged))); + private readonly long _selectionChangeCallbackToken; public WinoThreadMailItemViewModelListViewItem() { - RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged); + DefaultStyleKey = typeof(WinoThreadMailItemViewModelListViewItem); + + _selectionChangeCallbackToken = RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged); + } + + public void Cleanup() + { + if (Content is ThreadMailItemViewModel mailItem) + { + UnregisterSelectionCallback(mailItem); + + UnregisterPropertyChangedCallback(IsSelectedProperty, _selectionChangeCallbackToken); + } } private static void OnIsThreadExpandedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs dp) @@ -70,7 +83,7 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem IsThreadExpanded = IsSelected; } - private void UnregisterSelectionCallback(ThreadMailItemViewModel mailItem) + public void UnregisterSelectionCallback(ThreadMailItemViewModel mailItem) { mailItem.PropertyChanged -= MailPropChanged; } diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml b/Wino.Mail.WinUI/Views/MailListPage.xaml index 13406fc1..b2f92a7c 100644 --- a/Wino.Mail.WinUI/Views/MailListPage.xaml +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml @@ -92,6 +92,7 @@