From f79305f0a67216a27d2936ce65c9fec9aed2f047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sun, 28 Dec 2025 07:28:20 +0100 Subject: [PATCH] Fix the AOT issue with custom binding of IsSelected property through CVS in Mail List. --- .../Controls/ListView/WinoListView.cs | 4 +-- .../Controls/ListView/WinoListViewStyles.xaml | 6 ++-- .../WinoMailItemViewModelListViewItem.cs | 29 +++++++++++++++++++ ...WinoThreadMailItemViewModelListViewItem.cs | 28 ++++++++++++++++++ .../Views/Mail/MailListPage.xaml.cs | 8 +++++ 5 files changed, 70 insertions(+), 5 deletions(-) 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))] +[assembly: GeneratedWinRTExposedExternalType(typeof(ReadOnlyObservableGroup))] +[assembly: GeneratedWinRTExposedExternalType(typeof(ReadOnlyObservableGroupedCollection))] namespace Wino.Views.Mail;