如何确定Focus目前*的位置*?

时间:2011-05-17 00:59:03

标签: c# wpf datagrid focus

短版

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,但似乎无法找到当前的焦点持有者(或焦点丢失的人)。

1 个答案:

答案 0 :(得分:4)

FocusManager.GetFocusedElement(Application.Current.MainWindow)

如果DataGrid未托管在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;
    }
}