using System.Diagnostics; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Data; using Avalonia.LogicalTree; using Avalonia.Metadata; namespace Ursa.Controls; public class NavMenu: ItemsControl { public static readonly StyledProperty SelectedItemProperty = AvaloniaProperty.Register( nameof(SelectedItem), defaultBindingMode: BindingMode.TwoWay); public object? SelectedItem { get => GetValue(SelectedItemProperty); set => SetValue(SelectedItemProperty, value); } public static readonly StyledProperty IconBindingProperty = AvaloniaProperty.Register( nameof(IconBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? IconBinding { get => GetValue(IconBindingProperty); set => SetValue(IconBindingProperty, value); } public static readonly StyledProperty HeaderBindingProperty = AvaloniaProperty.Register( nameof(HeaderBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? HeaderBinding { get => GetValue(HeaderBindingProperty); set => SetValue(HeaderBindingProperty, value); } public static readonly StyledProperty SubMenuBindingProperty = AvaloniaProperty.Register( nameof(SubMenuBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? SubMenuBinding { get => GetValue(SubMenuBindingProperty); set => SetValue(SubMenuBindingProperty, value); } static NavMenu() { SelectedItemProperty.Changed.AddClassHandler((o, e) => o.OnSelectedItemChange(e)); } private void OnSelectedItemChange(AvaloniaPropertyChangedEventArgs args) { Debug.WriteLine(args.NewValue.Value); } protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey) { return NeedsContainer(item, out recycleKey); } protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) { 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; var children = this.LogicalChildren.OfType(); foreach (var child in children) { if (child != item) { child.IsSelected = false; } } if (item.DataContext is not null && item.DataContext != this.DataContext) { SelectedItem = item.DataContext; } else { SelectedItem = item; } item.IsSelected = true; } }