将CommandBindings添加到控件与使用RegisterClassCommandBinding之间有区别吗?

以前我一直在使用

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是静态的。 一个优先于另一个?

后者更像是一个全局处理程序,而前者是每个实例。

此外,RegisterClassCommandBinding无法取消注册,因此一旦注册,您就会陷入困境。 通常,在使用它时,最好在控件上调用虚方法,以便可以更改或绕过它们的行为。

使用CommandBindings,您可以删除不再需要的任何绑定。 这也可以由您的控件的外部用户完成。 因此,您可以添加所需的命令绑定,但有人可以轻松地执行element.CommandBindings.Clear()

所以存在差异,每个都有自己的位置。 如果您希望它可以轻松定制,我会选择前者。