Container cleanups.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user