using System.Diagnostics; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; 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); } public static readonly StyledProperty CommandBindingProperty = AvaloniaProperty.Register( nameof(CommandBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? CommandBinding { get => GetValue(CommandBindingProperty); set => SetValue(CommandBindingProperty, value); } public static readonly StyledProperty HeaderTemplateProperty = AvaloniaProperty.Register( nameof(HeaderTemplate)); public IDataTemplate? HeaderTemplate { get => GetValue(HeaderTemplateProperty); set => SetValue(HeaderTemplateProperty, value); } public static readonly StyledProperty IconTemplateProperty = AvaloniaProperty.Register( nameof(IconTemplate)); public IDataTemplate? IconTemplate { get => GetValue(IconTemplateProperty); set => SetValue(IconTemplateProperty, 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(); } internal void SelectItem(NavMenuItem item, NavMenuItem parent) { // if (item.IsSelected) return; foreach (var child in LogicalChildren) { if (child == parent) { continue; } if (child is NavMenuItem navMenuItem) { navMenuItem.ClearSelection(); } } if (item.DataContext is not null && item.DataContext != this.DataContext) { SelectedItem = item.DataContext; } else { SelectedItem = item; } item.IsSelected = true; } }