using System.Windows; using System.Windows.Input; namespace Core.Gui.Commands { /// /// Allows for binding of to the execution of a . /// public class RoutedCommandHandler : Freezable { /// /// Identifies the dependency property. /// public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( nameof(Command), typeof(ICommand), typeof(RoutedCommandHandler), new PropertyMetadata(default(ICommand))); /// /// Gets or sets the command that should be executed when the RoutedCommand fires. /// public ICommand Command { get => (ICommand) GetValue(CommandProperty); set => SetValue(CommandProperty, value); } /// /// The command that triggers the . /// public ICommand RoutedCommand { get; set; } protected override Freezable CreateInstanceCore() { return new RoutedCommandHandler(); } /// /// Registers this handler to respond to the registered RoutedCommand for the /// given element. /// /// The element for which we should register the command /// binding for the current routed command. internal void Register(FrameworkElement owner) { var binding = new CommandBinding(RoutedCommand, HandleExecute, HandleCanExecute); owner.CommandBindings.Add(binding); } /// /// Executes with the /// from . /// /// The owner of the routed command. /// The event arguments given by the routed event. private void HandleCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = Command?.CanExecute(e.Parameter) == true; e.Handled = true; } /// /// Executes with the /// from . /// /// The owner of the routed command. /// The event arguments given by the routed event. private void HandleExecute(object sender, ExecutedRoutedEventArgs e) { Command?.Execute(e.Parameter); e.Handled = true; } } }