WPF: изменения в текстовом поле с фокусом не выполняются до тех пор, пока не прекратится событие закрытия
У меня есть окно WPF для редактирования информации базы данных, которая представлена с использованием объекта Entity Framework. Когда пользователь закрывает окно, я хотел бы заметить в событии Закрытие, изменилась ли информация и отобразится окно сообщения, предлагающее сохранить изменения в базе данных.
К сожалению, изменения в редактируемом в данный момент редактировании не назначаются источнику привязки, пока редактирование не потеряет фокус, что происходит в какой-то момент после обработки события закрытия.
В идеале, была бы процедура, которая фиксирует все изменения в иерархии представлений, которые я мог бы вызвать, прежде чем проверять, был ли изменен мой объект. Я также искал информацию о программном очищении фокуса в элементе управления с фокусом, но не могу понять, как это сделать.
Мой вопрос: как это обычно обрабатывается?
Ответы
Ответ 1
Это должно быть довольно близко:
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();
}
}
}
Ответ 2
В WPF вы можете изменить Binding
, чтобы обновить источник при модификации, а не потерять фокус. Это делается путем установки свойства UpdateSourceTrigger
в PropertyChanged
:
Value="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}"
Ответ 3
Возможно, вам нужно удалить фокус из текущего элемента
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
FocusManager.SetFocusedElement(this, null);
}
Ответ 4
Предполагая, что в последовательности вкладок имеется более одного элемента управления, следующее решение оказывается полным и общим (просто вырезать-вставить)...
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();
}
Ответ 5
Также посмотрите на sugestions в этом сообщение
Ответ 6
Самый простой способ - установить фокус где-нибудь.
Вы можете сразу установить фокус, но настройка фокуса в любом месте вызовет событие 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();