我如何确定焦点*现在*的位置

本文关键字:现在 位置 焦点 何确定 | 更新日期: 2023-09-27 17:56:43

简短版本

public class CustomDataGrid : DataGridControl, IXmlSettingsProvider
{
    public CustomDataGrid()
    {
        if (DesignModeHelper.IsInDesignMode) return;
        Loaded += (e, a) =>
                      {
                          ...
                      };
        LostFocus += (e, a) =>
                         {
                             if(IsBeingEdited /* &&
                                CurrentFocusTarget.GetType() == typeof(TabControl)*/)
                                EndEdit();
                         };
    }
}

如何在上面的示例中找到UIElement CurrentFocusTarget

长版本 - 上下文

我们使用 XCeed DataGrid 来显示延迟加载的 TabControl 的不同选项卡中的数据。每个选项卡都是延迟加载的,以便仅在选项卡可见时呈现内容(更重要的是,提取数据)。使用 MVVM 方法,整个数据流效果很好。

问题所在

不知何故,每当用户对单元格和"更改"选项卡进行更改时,数据绑定 ViewModel 属性(已更新)都会设置为 null

为了避免这种情况,可以在焦点从网格中丢失时调用 EndEdit()。

但是,我只想在焦点丢失到 TabItem(或 TabControl)时调用它。

所以,我的问题是:

从代码隐藏中了解Focus现在在哪里的最简单方法是什么。我已经检查了FocusManager但似乎找不到当前的焦点持有者(或焦点丢失的人)。

我如何确定焦点*现在*的位置

FocusManager.GetFocusedElement(Application.Current.MainWindow)

如果数据网格未托管在Application.Current.MainWindow中,我可能需要特殊情况。

以下是完整的代码:

public class CustomDataGrid : DataGridControl, IXmlSettingsProvider
{
    public BSIDataGrid()
    {
        if (DesignModeHelper.IsInDesignMode) return;
        CommandBindings.Add(new CommandBinding(ResetDataGridLayout, ResetDataGridLayoutExecute, ResetDataGridLayoutCanExecute));
        Loaded += (e, a) =>
                      {
                          ...
                      };
        LostFocus += (e, a) =>
                         {
                             if(IsBeingEdited && IsTabFocused())
                                EndEdit();
                         };
    }
    private static bool IsTabFocused()
    {
        var dependencyObject = FocusManager.GetFocusedElement(Application.Current.MainWindow);
        return dependencyObject is TabItem;
    }
}