WPF: изменения в текстовом поле с фокусом не фиксируются до тех пор, пока не сработает событие закрытия - PullRequest
13 голосов
/ 21 октября 2008

У меня есть окно WPF для редактирования информации базы данных, которая представлена ​​с помощью объекта Entity Framework. Когда пользователь закрывает окно, я хотел бы заметить в событии закрытия, изменилась ли информация, и показать окно сообщения, предлагающее сохранить изменения в базе данных.

К сожалению, изменения в текущем редактируемом редакторе не назначаются источнику привязки, пока редактирование не теряет фокус, что происходит в некоторый момент после обработки события Closing.

В идеале, должна быть подпрограмма, которая фиксирует все изменения в иерархии представлений, которые я мог бы вызвать, прежде чем проверять, была ли изменена моя сущность. Я также искал информацию о программной очистке фокуса в элементе управления с фокусом, но не могу понять, как это сделать.

У меня вопрос, как это обычно обрабатывается?

Ответы [ 6 ]

21 голосов
/ 18 января 2011

В WPF вы можете изменить Binding для обновления источника при модификации, а не при потере фокуса. Это можно сделать, установив для свойства UpdateSourceTrigger значение PropertyChanged:

Value="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}"
7 голосов
/ 22 октября 2008

Это должно вас довольно близко:



private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    ForceDataValidation();
}


private static void ForceDataValidation()
{
    TextBox textBox = Keyboard.FocusedElement as TextBox;

    if (textBox != null)
    {
        BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty);
        if (be != null && !textBox.IsReadOnly && textBox.IsEnabled)
        {
            be.UpdateSource();
        }
    }

}


4 голосов
/ 14 октября 2014

Может быть, вам нужно убрать фокус с текущего элемента

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    FocusManager.SetFocusedElement(this, null);
}
1 голос
/ 18 января 2011

Предполагая, что в последовательности вкладок имеется более одного элемента управления, следующее решение выглядит полным и общим (просто вырезать и вставить) ...

Control currentControl = System.Windows.Input.Keyboard.FocusedElement as Control;

if (currentControl != null)
{
    // Force focus away from the current control to update its binding source.
    currentControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    currentControl.Focus();
}
0 голосов
/ 23 октября 2008

Самый простой способ - установить фокус где-нибудь. Вы можете немедленно вернуть фокус обратно, но установка фокуса в любом месте вызовет событие LostFocus на любом типе элемента управления и заставит его обновить свои вещи:

IInputElement x = System.Windows.Input.Keyboard.FocusedElement;
DummyField.Focus();
x.Focus();

Другим способом было бы получить сфокусированный элемент, получить привязывающий элемент из сфокусированного элемента и запустить обновление вручную. Пример для TextBox и ComboBox (вам нужно добавить любой тип элемента управления, который вам нужно поддерживать):

TextBox t = Keyboard.FocusedElement as TextBox;
if ((t != null) && (t.GetBindingExpression(TextBox.TextProperty) != null))
  t.GetBindingExpression(TextBox.TextProperty).UpdateSource();
ComboBox c = Keyboard.FocusedElement as ComboBox;
if ((c != null) && (c.GetBindingExpression(ComboBox.TextProperty) != null))
  c.GetBindingExpression(ComboBox.TextProperty).UpdateSource();
0 голосов
/ 22 октября 2008

Также посмотрите на предложения в этом посте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...