Files
Wino-Mail/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs

194 lines
6.7 KiB
C#
Raw Normal View History

2024-04-26 01:47:46 +02:00
using System.Collections;
2024-04-18 01:44:37 +02:00
using System.Collections.Specialized;
using System.Windows.Input;
2024-04-26 01:47:46 +02:00
using Microsoft.Xaml.Interactivity;
2024-04-18 01:44:37 +02:00
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Wino.Controls;
using Wino.Core.Domain.Models.Menus;
using Wino.Helpers;
namespace Wino.Behaviors
{
public class BindableCommandBarBehavior : Behavior<CommandBar>
{
public static readonly DependencyProperty PrimaryCommandsProperty = DependencyProperty.Register(
"PrimaryCommands", typeof(object), typeof(BindableCommandBarBehavior),
new PropertyMetadata(null, UpdateCommands));
public ICommand ItemClickedCommand
{
get { return (ICommand)GetValue(ItemClickedCommandProperty); }
set { SetValue(ItemClickedCommandProperty, value); }
}
public static readonly DependencyProperty ItemClickedCommandProperty = DependencyProperty.Register(nameof(ItemClickedCommand), typeof(ICommand), typeof(BindableCommandBarBehavior), new PropertyMetadata(null));
public object PrimaryCommands
{
get { return GetValue(PrimaryCommandsProperty); }
set { SetValue(PrimaryCommandsProperty, value); }
}
protected override void OnDetaching()
{
base.OnDetaching();
AttachChanges(false);
if (PrimaryCommands is IEnumerable enumerable)
{
foreach (var item in enumerable)
{
if (item is ButtonBase button)
{
button.Click -= Button_Click;
}
}
}
}
private void UpdatePrimaryCommands()
{
if (AssociatedObject == null)
return;
if (PrimaryCommands == null)
return;
if (AssociatedObject.PrimaryCommands is IEnumerable enumerableObjects)
{
foreach (var item in enumerableObjects)
{
if (item is ButtonBase button)
{
button.Click -= Button_Click;
}
}
}
if (AssociatedObject.SecondaryCommands is IEnumerable secondaryObject)
{
foreach (var item in secondaryObject)
{
if (item is ButtonBase button)
{
button.Click -= Button_Click;
}
}
}
AssociatedObject.PrimaryCommands.Clear();
AssociatedObject.SecondaryCommands.Clear();
if (!(PrimaryCommands is IEnumerable enumerable)) return;
foreach (var command in enumerable)
{
if (command is MailOperationMenuItem mailOperationMenuItem)
{
2024-04-26 01:47:46 +02:00
ICommandBarElement menuItem = null;
2024-04-18 01:44:37 +02:00
if (mailOperationMenuItem.Operation == Core.Domain.Enums.MailOperation.Seperator)
{
2024-04-26 01:47:46 +02:00
menuItem = new AppBarSeparator();
2024-04-18 01:44:37 +02:00
}
else
{
2024-04-26 01:47:46 +02:00
var label = XamlHelpers.GetOperationString(mailOperationMenuItem.Operation);
menuItem = new AppBarButton
2024-04-18 01:44:37 +02:00
{
Icon = new WinoFontIcon() { Glyph = ControlConstants.WinoIconFontDictionary[XamlHelpers.GetWinoIconGlyph(mailOperationMenuItem.Operation)] },
2024-04-26 01:47:46 +02:00
Label = label,
LabelPosition = string.IsNullOrWhiteSpace(label) ? CommandBarLabelPosition.Collapsed : CommandBarLabelPosition.Default,
2024-04-18 01:44:37 +02:00
DataContext = mailOperationMenuItem,
};
2024-09-01 01:12:00 +02:00
ToolTip toolTip = new ToolTip
{
Content = label
};
ToolTipService.SetToolTip((DependencyObject)menuItem, toolTip);
2024-04-26 01:47:46 +02:00
((AppBarButton)menuItem).Click -= Button_Click;
((AppBarButton)menuItem).Click += Button_Click;
}
2024-04-18 01:44:37 +02:00
2024-04-26 01:47:46 +02:00
if (mailOperationMenuItem.IsSecondaryMenuPreferred)
{
AssociatedObject.SecondaryCommands.Add(menuItem);
}
else
{
AssociatedObject.PrimaryCommands.Add(menuItem);
2024-04-18 01:44:37 +02:00
}
}
2024-04-26 01:47:46 +02:00
2024-04-18 01:44:37 +02:00
//if (dependencyObject is ICommandBarElement icommandBarElement)
//{
// if (dependencyObject is ButtonBase button)
// {
// button.Click -= Button_Click;
// button.Click += Button_Click;
// }
// if (command is MailOperationMenuItem mailOperationMenuItem)
// {
2024-04-26 01:47:46 +02:00
2024-04-18 01:44:37 +02:00
// }
//}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
ItemClickedCommand?.Execute(((ButtonBase)sender).DataContext);
}
protected override void OnAttached()
{
base.OnAttached();
AttachChanges(true);
UpdatePrimaryCommands();
}
private void PrimaryCommandsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
UpdatePrimaryCommands();
}
private static void UpdateCommands(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (!(dependencyObject is BindableCommandBarBehavior behavior)) return;
if (dependencyPropertyChangedEventArgs.OldValue is INotifyCollectionChanged oldList)
{
oldList.CollectionChanged -= behavior.PrimaryCommandsCollectionChanged;
}
behavior.AttachChanges(true);
behavior.UpdatePrimaryCommands();
}
private void AttachChanges(bool register)
{
if (PrimaryCommands is null) return;
if (PrimaryCommands is INotifyCollectionChanged collectionChanged)
{
if (register)
{
collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged;
collectionChanged.CollectionChanged += PrimaryCommandsCollectionChanged;
}
else
collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged;
}
}
}
}