Container cleanups.

This commit is contained in:
Burak Kaan Köse
2025-10-27 01:00:38 +01:00
parent d9fc365aeb
commit 54ac07f6fb
5 changed files with 60 additions and 24 deletions
@@ -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;
}
+2
View File
@@ -92,6 +92,7 @@
<listview:WinoListView
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ChoosingItemContainer="WinoListViewChoosingItemContainer"
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
ItemContainerStyle="{StaticResource DefaultMailListViewItemStyle}"
@@ -380,6 +381,7 @@
<listview:WinoListView
x:Name="MailListView"
HorizontalAlignment="Stretch"
ChoosingItemContainer="WinoListViewChoosingItemContainer"
HorizontalContentAlignment="Stretch"
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
@@ -22,6 +22,7 @@ using Wino.Core.Domain.Models.Menus;
using Wino.Core.Domain.Models.Navigation;
using Wino.Mail.ViewModels.Data;
using Wino.Mail.ViewModels.Messages;
using Wino.Mail.WinUI.Controls.ListView;
using Wino.MenuFlyouts.Context;
using Wino.Messaging.Client.Mails;
using Wino.Views.Abstract;
@@ -144,6 +145,21 @@ public sealed partial class MailListPage : MailListPageAbstract,
await ViewModel.MailCollection.UnselectAllAsync();
}
private void WinoListViewChoosingItemContainer(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;
}
private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args)
{
// TODO: New ItemsView implementation.