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