private static void OnApplyFixPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            EditModeSwitchButton button = obj as EditModeSwitchButton;

            if (button == null)
            {
                Debug.Fail("EditModeSwitchButtonKeyboardFix.ApplyFix fix can only be applied to EditModeSwitchButton instances.");
                return;
            }
            if (object.Equals(e.NewValue, true))
            {
                // Instantiating this class will make itself hook into EditModeSwitchButton's events,
                // hence not be chewed up by garbage collector
                new EditModeSwitchButtonKeyboardFix(button);
            }
        }
        private void OnEditModeSwitchButtonClick(object sender, RoutedEventArgs e)
        {
            if (_clickInitiatedByMouse)
            {
                return;
            }

            EditModeSwitchButton button = e.OriginalSource as EditModeSwitchButton;

            Fx.Assert(button != null, "Expected to see the EditModeSwitchButton at this point.");
            if (button == null)
            {
                return;
            }

            // At this point the click was initiated using the Invoke AutomationPeer pattern or
            // by using the keyboard.  So, make sure that the EditModeSwitchButton.OnMouseDown
            // button still executes.
            // Invoke the appropriate command
            switch (button.TargetEditMode)
            {
            case PropertyContainerEditMode.Inline:
                PropertyValueEditorCommands.ShowInlineEditor.Execute(null, button);
                break;

            case PropertyContainerEditMode.ExtendedPopup:
                PropertyValueEditorCommands.ShowExtendedPopupEditor.Execute(null, button);
                break;

            case PropertyContainerEditMode.ExtendedPinned:
                PropertyValueEditorCommands.ShowExtendedPinnedEditor.Execute(null, button);
                break;

            case PropertyContainerEditMode.Dialog:
                PropertyValueEditorCommands.ShowDialogEditor.Execute(null, button);
                break;

            default:
                Debug.Fail(string.Format(
                               CultureInfo.CurrentCulture,
                               "EditModeSwitchButtonKeyboardFix does not yet support PropertyContainerEditMode '{0}'.",
                               button.TargetEditMode.ToString()));
                break;
            }
        }
 private EditModeSwitchButtonKeyboardFix(EditModeSwitchButton button)
 {
     button.Click += new RoutedEventHandler(OnEditModeSwitchButtonClick);
     button.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(OnEditModeSwitchButtonPreviewMouseLeftButtonUp);
 }