New list view items.

This commit is contained in:
Burak Kaan Köse
2025-10-27 22:52:26 +01:00
parent 4eea21c4f5
commit 4f85fa6ba9
12 changed files with 398 additions and 243 deletions
@@ -1,86 +1,23 @@
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml;
using CommunityToolkit.WinUI;
using Microsoft.UI.Xaml.Controls;
using Wino.Mail.ViewModels.Data;
using Wino.Messaging.Client.Mails;
namespace Wino.Mail.WinUI.Controls.ListView;
public partial class WinoMailItemViewModelListViewItem : ListViewItem
{
private readonly long _selectionChangeCallbackToken;
[GeneratedDependencyProperty]
public partial MailItemViewModel? Item { get; set; }
public WinoMailItemViewModelListViewItem()
{
DefaultStyleKey = typeof(WinoMailItemViewModelListViewItem);
_selectionChangeCallbackToken = RegisterPropertyChangedCallback(IsSelectedProperty, OnIsSelectedChanged);
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (oldContent is MailItemViewModel oldMailItem)
{
UnregisterSelectionCallback(oldMailItem);
}
if (newContent is MailItemViewModel newMailItem)
{
IsSelected = newMailItem.IsSelected;
RegisterSelectionCallback(newMailItem);
}
}
public void Cleanup()
{
if (Content is MailItemViewModel mailItem)
{
UnregisterSelectionCallback(mailItem);
UnregisterPropertyChangedCallback(IsSelectedProperty, _selectionChangeCallbackToken);
}
}
private void UnregisterSelectionCallback(IMailListItem mailItem)
{
mailItem.PropertyChanged -= MailPropChanged;
}
private void RegisterSelectionCallback(IMailListItem mailItem)
{
mailItem.PropertyChanged -= MailPropChanged;
mailItem.PropertyChanged += MailPropChanged;
}
// From model
private void MailPropChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (sender is not MailItemViewModel mailItem) return;
if (e.PropertyName == nameof(MailItemViewModel.IsSelected)) ApplySelectionForContainer(mailItem);
}
// From container.
private void OnIsSelectedChanged(DependencyObject sender, DependencyProperty dp)
{
if (Content is IMailListItem mailItem)
{
ApplySelectionForModel(mailItem);
}
}
private void ApplySelectionForModel(IMailListItem mailItem)
{
mailItem.IsSelected = IsSelected;
WeakReferenceMessenger.Default.Send(new SelectedItemsChangedMessage());
}
private void ApplySelectionForContainer(IMailListItem mailItem)
{
if (IsSelected != mailItem.IsSelected)
{
IsSelected = mailItem.IsSelected;
}
if (newContent is MailItemViewModel mailItemViewModel) Item = mailItemViewModel;
}
}