Подтвердить что ты не робот

WPF: изменения в текстовом поле с фокусом не выполняются до тех пор, пока не прекратится событие закрытия

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

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

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

Мой вопрос: как это обычно обрабатывается?

4b9b3361

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