diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs b/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs
index bd2a63c5..49fe2998 100644
--- a/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs
+++ b/Wino.Mail.WinUI/Controls/ListView/WinoListView.cs
@@ -69,7 +69,7 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
&& container.Item != mailItemViewModel)
{
container.Item = mailItemViewModel;
- container.IsSelected = mailItemViewModel.IsSelected;
+ container.IsCustomSelected = mailItemViewModel.IsSelected;
}
else if (item is ThreadMailItemViewModel threadMailItemViewModel
&& element is WinoThreadMailItemViewModelListViewItem threadContainer
@@ -88,7 +88,7 @@ public partial class WinoListView : Microsoft.UI.Xaml.Controls.ListView
if (item is MailItemViewModel mailItemViewModel && element is WinoMailItemViewModelListViewItem container)
{
container.Item = null;
- container.IsSelected = false;
+ container.IsCustomSelected = false;
}
else if (item is ThreadMailItemViewModel threadMailItemViewModel && element is WinoThreadMailItemViewModelListViewItem threadContainer)
{
diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoListViewStyles.xaml b/Wino.Mail.WinUI/Controls/ListView/WinoListViewStyles.xaml
index 020644eb..22338ac8 100644
--- a/Wino.Mail.WinUI/Controls/ListView/WinoListViewStyles.xaml
+++ b/Wino.Mail.WinUI/Controls/ListView/WinoListViewStyles.xaml
@@ -49,7 +49,7 @@
HorizontalAlignment="Center"
Background="{ThemeResource ListViewItemSelectionIndicatorBrush}"
CornerRadius="4"
- Visibility="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Item.IsSelected, Mode=OneWay}" />
+ Visibility="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=IsCustomSelected, Mode=OneWay}" />
+ Visibility="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=IsCustomSelected, Mode=OneWay}" />
+ Visibility="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=IsCustomSelected, Mode=OneWay}" />
model.PropertyChanged += ModelPropertyChanged;
+ private void UnregisterPropertyChanged(MailItemViewModel model) => model.PropertyChanged -= ModelPropertyChanged;
+
+ private void ModelPropertyChanged(object? sender, PropertyChangedEventArgs e)
+ {
+ if (sender is not MailItemViewModel mailItemViewModel) return;
+
+ if (e.PropertyName == nameof(MailItemViewModel.IsSelected))
+ {
+ IsCustomSelected = mailItemViewModel.IsSelected;
+ }
+ }
}
diff --git a/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs b/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs
index f9a88c45..518b067b 100644
--- a/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs
+++ b/Wino.Mail.WinUI/Controls/ListView/WinoThreadMailItemViewModelListViewItem.cs
@@ -1,12 +1,17 @@
+using System.ComponentModel;
+using System.Diagnostics;
using System.Linq;
using CommunityToolkit.WinUI;
+using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Wino.Controls;
using Wino.Helpers;
using Wino.Mail.ViewModels.Data;
+using WinRT;
namespace Wino.Mail.WinUI.Controls.ListView;
+[GeneratedBindableCustomProperty]
public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem
{
[GeneratedDependencyProperty]
@@ -15,6 +20,8 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem
[GeneratedDependencyProperty]
public partial ThreadMailItemViewModel? Item { get; set; }
+ [GeneratedDependencyProperty]
+ public partial bool IsCustomSelected { get; set; }
public WinoThreadMailItemViewModelListViewItem()
{
@@ -31,4 +38,25 @@ public partial class WinoThreadMailItemViewModelListViewItem : ListViewItem
}
public WinoExpander? GetExpander() => WinoVisualTreeHelper.FindDescendants(this).FirstOrDefault();
+
+ partial void OnItemPropertyChanged(DependencyPropertyChangedEventArgs e)
+ {
+ Debug.WriteLine("WinoMailItemViewModelListViewItem item changed");
+
+ if (e.OldValue is ThreadMailItemViewModel oldMailItemViewModel) UnregisterPropertyChanged(oldMailItemViewModel);
+ if (e.NewValue is ThreadMailItemViewModel newMailItemViewModel) RegisterPropertyChanged(newMailItemViewModel);
+ }
+
+ private void RegisterPropertyChanged(ThreadMailItemViewModel model) => model.PropertyChanged += ModelPropertyChanged;
+ private void UnregisterPropertyChanged(ThreadMailItemViewModel model) => model.PropertyChanged -= ModelPropertyChanged;
+
+ private void ModelPropertyChanged(object? sender, PropertyChangedEventArgs e)
+ {
+ if (sender is not ThreadMailItemViewModel mailItemViewModel) return;
+
+ if (e.PropertyName == nameof(ThreadMailItemViewModel.IsSelected))
+ {
+ IsCustomSelected = mailItemViewModel.IsSelected;
+ }
+ }
}
diff --git a/Wino.Mail.WinUI/Views/Mail/MailListPage.xaml.cs b/Wino.Mail.WinUI/Views/Mail/MailListPage.xaml.cs
index 96649e99..67d7365b 100644
--- a/Wino.Mail.WinUI/Views/Mail/MailListPage.xaml.cs
+++ b/Wino.Mail.WinUI/Views/Mail/MailListPage.xaml.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.Collections;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.WinUI;
using Microsoft.Extensions.DependencyInjection;
@@ -29,6 +30,13 @@ using Wino.Mail.WinUI.Extensions;
using Wino.MenuFlyouts.Context;
using Wino.Messaging.Client.Mails;
using Wino.Views.Abstract;
+using WinRT;
+
+// object, IMailListItem
+// Register generic types from CommunityToolkit.Mvvm for AOT compatibility when passed across WinRT boundary
+[assembly: GeneratedWinRTExposedExternalType(typeof(ObservableGroup