static void OnCommandChanged(Control sender, AttachedPropertyChangedEventArgs<ICommand> e) { Button button = sender as Button; if(button == null) return; UpdateButtonEnabled(button, e.NewValue, GetCommandParameter(button)); button.Click -= OnClick; if(e.OldValue != null) { var handler = button.GetValue(HandlerProperty); e.OldValue.CanExecuteChanged -= handler.Handler; button.ClearValue(HandlerProperty); } if(e.NewValue != null) { button.Click += OnClick; var handler = new CanExecuteChangedHandler(button, (b, o, ea) => UpdateButtonEnabled(b, b.GetCommand(), b.GetCommandParameter())); e.NewValue.CanExecuteChanged += handler.Handler; button.SetValue(HandlerProperty, handler); } }