Как я могу передать текущее имя элемента через CommandParameter в XAML? - PullRequest
0 голосов
/ 02 декабря 2018

В моем приложении WPF MVVM я хочу отменить изменения отдельных элементов TextBox с помощью клавиши Esc.Я настроил команду для этого, и я хочу запустить ее через XAML, таким образом:

<Window.InputBindings>
    <KeyBinding Command="{Binding EscKeyCommand}" CommandParameter="{Binding FocusManager.FocusedElement}"  Gesture="ESC" />
</Window.InputBindings>

Идея состоит в том, что CommandParameter передает ElementName в настоящее время фокусированного TextBox (если это действительно то, что находится в фокусе)и соответствующая отмена может быть обработана в ViewModel.Я пробовал несколько параметров для CommandParameter, включая приведенный выше, но все они возвращают ноль.Итак,

Вопрос

Как передать текущее имя элемента в фокусе через CommandParameter?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

FocusManager дает элемент с логическим фокусом.Чтобы использовать FocusManager.FocusedElement область должна быть предоставлена, в этом случае окно (this)

IInputElement focusedControl = FocusManager.GetFocusedElement(this);

Но в вашем случае, так как это текстовое поле, вам нужен фокус использования Keyboard.FocusedElement.

В модели представления при выполнении EscKeyCommand получите элемент с фокусом клавиатуры со следующим синтаксисом и очистите текст.

UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
0 голосов
/ 03 декабря 2018

Я рад, что вы уже заметили KeyBoard.FocusedElment.Но есть еще ответ на вопрос.Поскольку FocusManager.FocusedElement является вложенным свойством, правильный способ его привязки должен быть следующим:

CommandParameter="{Binding (FocusManager.FocusedElement), ElementName='name of the window'}"
...