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

C# 如何通过XAML中的CommandParameter传递当前关注的元素名称?,c#,wpf,xaml,mvvm,commandparameter,C#,Wpf,Xaml,Mvvm,Commandparameter,在我的WPF MVVM应用程序中,我希望能够使用Esc键撤消对单个文本框元素的更改。我已经为此设置了一个命令,我想通过XAML触发它,因此: <Window.InputBindings> <KeyBinding Command="{Binding EscKeyCommand}" CommandParameter="{Binding FocusManager.FocusedElement}" Gesture="ESC" /> </Window.InputBi

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

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

其思想是CommandParameter传递当前聚焦文本框的ElementName(如果确实是聚焦文本框),然后可以在ViewModel中处理相应的撤消。我尝试了CommandParameter的许多选项,包括上面的一个,但它们都返回null。所以

问题


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

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

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

我很高兴您已经注意到了
键盘.FocusedElment
。但这个问题仍然有答案。由于
FocusManager.FocusedElement
是一个附加属性,因此绑定它的正确方法应该是:

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

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

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

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

UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

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

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

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

UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

它没有回答我特别提出的问题,但我刚刚意识到我可以使用Keyboard.FocusedElement在命令中确定聚焦元素的名称。因此,不需要传递任何CommandParameter。作为用户,如果ESC是“Undo”,我会感到惊讶。Ctrl-Z是“撤销”。的确如此,但我有一些令人惊讶的用户;-)它没有回答我特别提出的问题,但我刚刚意识到我可以使用Keyboard.FocusedElement在命令中确定聚焦元素的名称。因此,不需要传递任何CommandParameter。作为用户,如果ESC是“Undo”,我会感到惊讶。Ctrl-Z是“撤销”。的确如此,但我有一些令人惊讶的用户;-)太好了,这和@AselaLiyanage的答案一样完美。那我该选哪一个呢?保持MVVM/解耦的心态,我认为这是一个原因,因为命令只对“某个地方的元素”执行操作。在命令中使用Keyboard.FocusedElement更像是与UI的对话。请注意,这里可能是在吹毛求疵。感谢两位的贡献。太好了,这和@AselaLiyanage的答案一样完美。那我该选哪一个呢?保持MVVM/解耦的心态,我认为这是一个原因,因为命令只对“某个地方的元素”执行操作。在命令中使用Keyboard.FocusedElement更像是与UI的对话。请注意,这里可能是在吹毛求疵。感谢双方的贡献。