Пользовательская команда не работает - PullRequest
12 голосов
/ 03 декабря 2010

В моем 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 (new CommandBinding (MyCustomCommand ....

1 Ответ

15 голосов
/ 03 декабря 2010

Упс, извините, я довольно быстро отправил свой оригинальный ответ.Теперь я вижу, что проблема не с типом, а с 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...