Пользовательская команда не работает

В моем XAML у меня есть это:

<UserControl.CommandBindings>
    <CommandBinding Command="Help"
   CanExecute="HelpCanExecute"
   Executed="HelpExecuted" />
</UserControl.CommandBindings>

<MenuItem Header="Help" Command="Help" />

Это прекрасно работает. Поэтому, когда я нажимаю контекстное меню, вызывается HelpExecuted().

Теперь я хочу сделать то же самое, кроме использования пользовательской команды вместо команды справки. Итак, что я делаю:

public RoutedCommand MyCustomCommand = new RoutedCommand();

и измените мой XAML на:

<UserControl.CommandBindings>
    <CommandBinding Command="MyCustomCommand"
   CanExecute="HelpCanExecute"
   Executed="HelpExecuted" />
</UserControl.CommandBindings>

<MenuItem Header="Help" Command="MyCustomCommand" />

Но я получаю ошибку: невозможно преобразовать строку "MyCustomCommand" в атрибут "Command" к объекту типа "System.Windows.Input.ICommand". CommandConverter не может конвертировать из System.String.

Что мне здесь не хватает? И обратите внимание, что я хочу сделать все это в XAML, т.е. Не хочу использовать CommandBindings.Add(новый CommandBinding (MyCustomCommand....

Ответ 1

К сожалению, было немного быстро, чтобы опубликовать мой оригинальный ответ. Теперь я вижу, что проблема связана не с типом, а с CommandBinding. Для разрешения имени команды вам необходимо использовать расширение разметки. Обычно я делаю свои команды статичными в своем объявлении следующим образом:

namespace MyApp.Commands
{
    public class MyApplicationCommands
    {
        public static RoutedUICommand MyCustomCommand 
                               = new RoutedUICommand("My custom command", 
                                                     "MyCustomCommand", 
                                                     typeof(MyApplicationCommands));
    }
}

И в XAML:

<UserControl x:Class="..."
             ...
             xmlns:commands="clr-namespace:MyApp.Commands">
...
<UserControl.CommandBindings>
    <CommandBinding Command="{x:Static commands:MyApplicationCommands.MyCustomCommand}"
    CanExecute="HelpCanExecute"
    Executed="HelpExecuted" />
</UserControl.CommandBindings>

Вам нужно ввести пространство имен содержащего класса с помощью xmlns. Я назвал это "командами" в моем примере выше.

Оригинальное сообщение ниже:

Попробуйте изменить тип команды на RoutedUICommand. Конструктор немного отличается:

public RoutedUICommand MyCustomCommand 
             = new RoutedUICommand("Description", "Name", typeof(ContainingClass));