如何通过XAML中的CommandParameter传递当前关注的元素名称?

时间:2018-12-02 15:35:17

标签: c# wpf xaml mvvm commandparameter

在WPF MVVM应用程序中,我希望能够使用Esc键撤消对单个TextBox元素的更改。我为此设置了一个命令,因此我想通过XAML触发它:

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

这个想法是CommandParameter传递当前关注的TextBox的ElementName(如果确实是焦点所在),然后可以在ViewModel中处理适当的撤消。我已经为CommandParameter尝试了许多选项,包括上面的选项,但是它们都返回null。所以,

问题

如何通过CommandParameter传递当前关注的元素名称?

2 个答案:

答案 0 :(得分:1)

很高兴您已经注意到%lu。但是仍然有一个答案。由于KeyBoard.FocusedElment是附加属性,因此绑定它的正确方法应该是:

FocusManager.FocusedElement

答案 1 :(得分:1)

FocusManager使元素具有逻辑焦点。要使用FocusManager.FocusedElement,需要提供范围,在这种情况下,窗口为(this)

IInputElement focusedControl = FocusManager.GetFocusedElement(this);

但是在您的情况下,因为它是一个文本框,所以您需要重点使用Keyboard.FocusedElement

在视图模型中执行EscKeyCommand时,使用以下语法获取具有键盘焦点的元素,然后清除文本。

UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;