WIP: inherit binding from root.

This commit is contained in:
rabbitism
2024-02-12 12:12:36 +08:00
parent 0a3dcf0d8c
commit bc9412aad2
5 changed files with 184 additions and 36 deletions

View File

@@ -4,6 +4,7 @@ using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.LogicalTree;
using Avalonia.Metadata;
namespace Ursa.Controls;
@@ -18,6 +19,39 @@ public class NavMenu: ItemsControl
set => SetValue(SelectedItemProperty, value);
}
public static readonly StyledProperty<IBinding?> IconBindingProperty = AvaloniaProperty.Register<NavMenu, IBinding?>(
nameof(IconBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? IconBinding
{
get => GetValue(IconBindingProperty);
set => SetValue(IconBindingProperty, value);
}
public static readonly StyledProperty<IBinding?> HeaderBindingProperty = AvaloniaProperty.Register<NavMenu, IBinding?>(
nameof(HeaderBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? HeaderBinding
{
get => GetValue(HeaderBindingProperty);
set => SetValue(HeaderBindingProperty, value);
}
public static readonly StyledProperty<IBinding?> SubMenuBindingProperty = AvaloniaProperty.Register<NavMenu, IBinding?>(
nameof(SubMenuBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? SubMenuBinding
{
get => GetValue(SubMenuBindingProperty);
set => SetValue(SubMenuBindingProperty, value);
}
static NavMenu()
{
SelectedItemProperty.Changed.AddClassHandler<NavMenu, object?>((o, e) => o.OnSelectedItemChange(e));
@@ -37,7 +71,27 @@ public class NavMenu: ItemsControl
{
return new NavMenuItem();
}
protected override void PrepareContainerForItemOverride(Control container, object? item, int index)
{
base.PrepareContainerForItemOverride(container, item, index);
if (container is NavMenuItem navMenuItem)
{
if (IconBinding is not null)
{
navMenuItem[!NavMenuItem.IconProperty] = IconBinding;
}
if (HeaderBinding is not null)
{
navMenuItem[!HeaderedItemsControl.HeaderProperty] = HeaderBinding;
}
if (SubMenuBinding is not null)
{
navMenuItem[!ItemsSourceProperty] = SubMenuBinding;
}
}
}
internal void SelectItem(NavMenuItem item)
{
if (item.IsSelected) return;