找到焦点,知道要复制什么

本文关键字:复制 什么 焦点 | 更新日期: 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属性将其传递给函数。如果只有一个可能的目标对象,则可以通过绑定来实现。

但是,我可以想象这可能不是一个选项,因为功能区中的"复制"按钮很可能会处理多个对象。在这种情况下,我不会使用CommandCommandParameter属性,而是在代码后面实现一个点击处理程序。

在这里,您可以选择使用视图的所有功能(包括FocusManager)来确定聚焦元素或其他目标对象。确定目标后,现在可以调用命令的Execute方法,将正确的对象作为参数传递。

但是,在尝试获取焦点元素之前,您应该查询CanExecute方法,以便仅在可以执行命令的情况下确定目标对象。如果要根据CanExecute方法的结果启用/禁用复制按钮,则需要进行一些额外的工作。

注意:这篇文章表明,在DataGrid中使用焦点管理器可能存在一些问题。