Есть ли разница между добавлением CommandBindings в элемент управления по сравнению с использованием RegisterClassCommandBinding? - PullRequest
5 голосов
/ 17 июня 2011

Ранее я использовал

this.CommandBindings.Add(
    new CommandBinding(ApplicationCommands.Copy, this.cmdCopy_Executed, this.cmdCopy_CanExecute))

где cmdCopy_Executed - нестатическая функция, но я видел людей, использующих

static MyControl()
    {
        CommandBinding binding =
            new CommandBinding(ApplicationCommands.Save, CommandHandler);
        CommandManager.RegisterClassCommandBinding(typeof(MyControl), binding);
    }
 private static void CommandHandler(object target, ExecutedRoutedEventArgs e)
    {
        MessageBox.Show("Command Handled!");
    }

где CommandBinding является статическим. Один предпочтительнее другого?

1 Ответ

6 голосов
/ 17 июня 2011

Последний является более глобальным обработчиком по сравнению с первым, который используется для каждого экземпляра.

Кроме того, RegisterClassCommandBinding не может быть незарегистрированным, поэтому вы застряли с ним после регистрации.Как правило, при использовании этого лучше всего вызывать виртуальные методы на вашем элементе управления, чтобы их поведение можно было изменить или пропустить.

С помощью CommandBindings вы можете удалить любые привязки, которые больше не нужны.Это также может быть сделано внешними пользователями вашего контроля.Таким образом, вы можете добавить обязательную привязку команды, но кто-то может легко сделать element.CommandBindings.Clear().

Так что есть различия, и у каждого есть свое место.Если вы хотите, чтобы это было легко настраиваемым, я бы пошел с первым.

...