找到焦点,知道要复制什么
本文关键字:复制 什么 焦点 | 更新日期: 2023-09-27 18:20:39
我的Ribbon中有一个Copy按钮,我需要确定关注哪个控件,以便知道要调用哪个Copy方法。有什么想法吗?我在想FocusManager.GetFocusedElement,但我使用的是MVVM,所以我不知道该传递什么作为参数。
private void Copy()
{
if (**Here_I_need_to_know_what_is_focused** is DataGridCell)
{
ApplicationCommands.Copy.Execute(null, this.DisplayedData);
}
else if ((this.CurrentFiles.SelectedItem is DSViewModel) || (this.CurrentFiles.SelectedItem is QViewModel))
{
this.CurrentFiles.Copy(this.CurrentFiles.SelectedItem);
}
else
{
ApplicationCommands.Copy.Execute(null, Keyboard.FocusedElement);
}
}
这实际上取决于代码的位置。
我假设它位于视图模型中——在这种情况下,您将无法直接访问FocusMangager
。为了获得当前关注的元素,您必须通过CommandParameter
属性将其传递给函数。如果只有一个可能的目标对象,则可以通过绑定来实现。
但是,我可以想象这可能不是一个选项,因为功能区中的"复制"按钮很可能会处理多个对象。在这种情况下,我不会使用Command
和CommandParameter
属性,而是在代码后面实现一个点击处理程序。
在这里,您可以选择使用视图的所有功能(包括FocusManager
)来确定聚焦元素或其他目标对象。确定目标后,现在可以调用命令的Execute
方法,将正确的对象作为参数传递。
但是,在尝试获取焦点元素之前,您应该查询CanExecute
方法,以便仅在可以执行命令的情况下确定目标对象。如果要根据CanExecute
方法的结果启用/禁用复制按钮,则需要进行一些额外的工作。
注意:这篇文章表明,在DataGrid
中使用焦点管理器可能存在一些问题。