Как сделать так, чтобы элемент управления потерял фокус, если пользователь нажимает на то, что не фокусируется? - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть ItemsControl, заполненный десятками предметов;каждый элемент представляет собой связанное текстовое поле и пару кнопок.Поскольку я хочу, чтобы пользователь мог переходить от текстового поля к текстовому полю, для кнопок Focusable установлено значение False.Это работает просто отлично.Единственная проблема заключается в том, что, поскольку текстовые поля не теряют фокус, их привязка не обновляет источник, поэтому код позади кнопок не работает с правильными значениями.

Я могу думать оспособ исправить это, например, с помощью обработчика Click для кнопок перемещаться по логическому дереву к связанному с ним текстовому полю и делать привязку, обновлять источник явным образом.Но мне кажется, что должен быть лучший способ, который, вероятно, был бы очевиден для меня, если бы я лучше понимал модель фокусировки.Есть ли?

Ответы [ 2 ]

1 голос
/ 20 февраля 2010

Поскольку производительность - это проблема, вам может пригодиться статья , написанная Джошем Смитом .Контекст очень похож на вашу проблему.Джош решает это, запуская обновление привязки вручную:

    TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
    if (focusedTextBox == null)
        return;

    BindingExpression textBindingExpr = 
      focusedTextBox.GetBindingExpression(TextBox.TextProperty);
    if (textBindingExpr == null)
        return;

    textBindingExpr.UpdateSource();
1 голос
/ 20 февраля 2010

Если производительность позволяет, вы можете изменить UpdateSourceTrigger этих элементов TextBox на PropertyChanged вместо LostFocus.

...