using Avalonia; using Avalonia.Controls.Primitives; using Avalonia.Metadata; using Avalonia.Xaml.Interactivity; using Toolkit.Foundation; namespace Toolkit.UI.Avalonia; public class NavigateAction : AvaloniaObject, IAction { public static readonly StyledProperty ContextProperty = AvaloniaProperty.Register(nameof(Context)); public static readonly DirectProperty ParameterBindingsProperty = AvaloniaProperty.RegisterDirect(nameof(ParameterBindings), x => x.ParameterBindings); public static readonly StyledProperty ParametersProperty = AvaloniaProperty.Register(nameof(Parameters)); public static readonly StyledProperty RouteProperty = AvaloniaProperty.Register(nameof(Route)); public static readonly StyledProperty ScopeProperty = AvaloniaProperty.Register(nameof(Scope)); private ParameterBindingCollection parameterCollection = []; public event EventHandler? Navigated; public object Context { get => GetValue(ContextProperty); set => SetValue(ContextProperty, value); } [Content] public ParameterBindingCollection ParameterBindings => parameterCollection ??= []; public object[]? Parameters { get => GetValue(ParametersProperty); set => SetValue(ParametersProperty, value); } public string Route { get => GetValue(RouteProperty); set => SetValue(RouteProperty, value); } public string Scope { get => GetValue(ScopeProperty); set => SetValue(ScopeProperty, value); } public object Execute(object? sender, object? parameter) { if (sender is TemplatedControl control) { Dictionary arguments = new(StringComparer.InvariantCultureIgnoreCase); if (control.DataContext is IObservableViewModel observableViewModel) { object[] parameters = [.. Parameters ?? Enumerable.Empty(), .. ParameterBindings is { Count: > 0 } ? ParameterBindings.Select(binding => new KeyValuePair(binding.Key, binding.Value)).ToArray() : Enumerable.Empty>()]; observableViewModel.Publisher.Publish(new NavigateEventArgs(Route, Context == this ? control : Context, Scope ?? null, control.DataContext, Navigated, parameters)).ConfigureAwait(false); } } return true; } }