Files
Wino-Mail/Wino.Mail.WinUI/Controls/ListView/WinoListViewItem.cs
T
2025-10-26 14:53:22 +01:00

104 lines
3.0 KiB
C#

using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Wino.Mail.ViewModels.Data;
using Wino.Messaging.Client.Mails;
namespace Wino.Mail.WinUI.Controls.ListView;
public partial class WinoListViewItem : ListViewItem
{
public bool IsExpanded
{
get { return (bool)GetValue(IsExpandedProperty); }
set { SetValue(IsExpandedProperty, value); }
}
public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register(nameof(IsExpanded), typeof(bool), typeof(WinoListViewItem), new PropertyMetadata(false, OnIsExpandedChanged));
public WinoListViewItem()
{
DefaultStyleKey = typeof(WinoListViewItem);
RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged);
}
private static void OnIsExpandedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is WinoListViewItem item)
{
// Handle expansion state change if needed
}
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (oldContent is IMailListItem oldMailItem)
{
UnregisterSelectionCallback(oldMailItem);
}
if (newContent is IMailListItem newMailItem)
{
IsSelected = newMailItem.IsSelected;
RegisterSelectionCallback(newMailItem);
}
}
private void UnregisterSelectionCallback(IMailListItem mailItem)
{
mailItem.PropertyChanged -= MailPropChanged;
}
private void RegisterSelectionCallback(IMailListItem mailItem)
{
mailItem.PropertyChanged += MailPropChanged;
}
// From model
private void MailPropChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (sender is not IMailListItem mailItem) return;
if (e.PropertyName == nameof(IMailListItem.IsSelected)) ApplySelectionForContainer(mailItem);
}
// From container.
private void OnIsSelectedChanged(DependencyObject sender, DependencyProperty dp)
{
if (Content is IMailListItem mailItem)
{
ApplySelectionForModel(mailItem);
}
}
private void ApplySelectionForModel(IMailListItem mailItem)
{
if (mailItem.IsSelected != IsSelected)
{
mailItem.IsSelected = IsSelected;
WeakReferenceMessenger.Default.Send(new SelectedItemsChangedMessage());
}
}
private void ApplySelectionForContainer(IMailListItem mailItem)
{
if (IsSelected != mailItem.IsSelected)
{
IsSelected = mailItem.IsSelected;
}
}
public WinoListView? GetWinoListViewControl()
{
var expander = GetTemplateChild("ExpanderPart") as Expander;
if (expander?.Content is ContentPresenter presenter) return VisualTreeHelper.GetChild(presenter, 0) as WinoListView;
return null;
}
}