我如何确定焦点*现在*的位置
本文关键字:现在 位置 焦点 何确定 | 更新日期: 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;
}
}