Как я могу определить, где сейчас находится Фокус? - PullRequest
4 голосов
/ 17 мая 2011

короткая версия

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 Ответ

4 голосов
/ 17 мая 2011
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;
    }
}
...