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 Microsoft.UI.Xaml.Controls;
|
||||||
using Wino.Mail.ViewModels.Data;
|
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 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)
|
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
|
||||||
{
|
{
|
||||||
if (item is MailItemViewModel mailItemViewModel && element is WinoMailItemViewModelListViewItem container)
|
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);
|
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)
|
public bool SelectMailItemContainer(MailItemViewModel mailItemViewModel)
|
||||||
{
|
{
|
||||||
WinoMailItemViewModelListViewItem? itemContainer = null;
|
WinoMailItemViewModelListViewItem? itemContainer = null;
|
||||||
|
|||||||
@@ -8,11 +8,12 @@ namespace Wino.Mail.WinUI.Controls.ListView;
|
|||||||
|
|
||||||
public partial class WinoMailItemViewModelListViewItem : ListViewItem
|
public partial class WinoMailItemViewModelListViewItem : ListViewItem
|
||||||
{
|
{
|
||||||
|
private readonly long _selectionChangeCallbackToken;
|
||||||
public WinoMailItemViewModelListViewItem()
|
public WinoMailItemViewModelListViewItem()
|
||||||
{
|
{
|
||||||
DefaultStyleKey = typeof(WinoMailItemViewModelListViewItem);
|
DefaultStyleKey = typeof(WinoMailItemViewModelListViewItem);
|
||||||
|
|
||||||
RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged);
|
_selectionChangeCallbackToken = RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnContentChanged(object oldContent, object newContent)
|
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)
|
private void UnregisterSelectionCallback(IMailListItem mailItem)
|
||||||
{
|
{
|
||||||
mailItem.PropertyChanged -= MailPropChanged;
|
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)));
|
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()
|
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)
|
private static void OnIsThreadExpandedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs dp)
|
||||||
@@ -70,7 +83,7 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem
|
|||||||
IsThreadExpanded = IsSelected;
|
IsThreadExpanded = IsSelected;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UnregisterSelectionCallback(ThreadMailItemViewModel mailItem)
|
public void UnregisterSelectionCallback(ThreadMailItemViewModel mailItem)
|
||||||
{
|
{
|
||||||
mailItem.PropertyChanged -= MailPropChanged;
|
mailItem.PropertyChanged -= MailPropChanged;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
<listview:WinoListView
|
<listview:WinoListView
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
HorizontalContentAlignment="Stretch"
|
HorizontalContentAlignment="Stretch"
|
||||||
|
ChoosingItemContainer="WinoListViewChoosingItemContainer"
|
||||||
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
|
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
|
||||||
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
|
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
|
||||||
ItemContainerStyle="{StaticResource DefaultMailListViewItemStyle}"
|
ItemContainerStyle="{StaticResource DefaultMailListViewItemStyle}"
|
||||||
@@ -380,6 +381,7 @@
|
|||||||
<listview:WinoListView
|
<listview:WinoListView
|
||||||
x:Name="MailListView"
|
x:Name="MailListView"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
|
ChoosingItemContainer="WinoListViewChoosingItemContainer"
|
||||||
HorizontalContentAlignment="Stretch"
|
HorizontalContentAlignment="Stretch"
|
||||||
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
|
toolkitExt:ListViewExtensions.ItemContainerStretchDirection="Horizontal"
|
||||||
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
|
toolkitExt:ScrollViewerExtensions.VerticalScrollBarMargin="0"
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ using Wino.Core.Domain.Models.Menus;
|
|||||||
using Wino.Core.Domain.Models.Navigation;
|
using Wino.Core.Domain.Models.Navigation;
|
||||||
using Wino.Mail.ViewModels.Data;
|
using Wino.Mail.ViewModels.Data;
|
||||||
using Wino.Mail.ViewModels.Messages;
|
using Wino.Mail.ViewModels.Messages;
|
||||||
|
using Wino.Mail.WinUI.Controls.ListView;
|
||||||
using Wino.MenuFlyouts.Context;
|
using Wino.MenuFlyouts.Context;
|
||||||
using Wino.Messaging.Client.Mails;
|
using Wino.Messaging.Client.Mails;
|
||||||
using Wino.Views.Abstract;
|
using Wino.Views.Abstract;
|
||||||
@@ -144,6 +145,21 @@ public sealed partial class MailListPage : MailListPageAbstract,
|
|||||||
await ViewModel.MailCollection.UnselectAllAsync();
|
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)
|
private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
// TODO: New ItemsView implementation.
|
// TODO: New ItemsView implementation.
|
||||||
|
|||||||
Reference in New Issue
Block a user