IsDirty с использованием INotifyPropertyChanged для объекта EF - PullRequest
3 голосов
/ 22 марта 2012

С учетом формы редактирования записи std с использованием двусторонней привязки WPF к объекту EF-сущности

IsDirty обрабатывается следующим образом

entity.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(ct_PropertyChanged);
DataContext = entity;

void entity_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    IsDirty = true;
}

void SaveAndClose()
{
    if ( IsDirty ) { // doSave }
    Close();
}

Все отлично работает, кроме случаев, когда пользователь изменяет только fieldXи нажимает save (что является допустимой моделью в этом случае!)

Проблема в том, что PropertyChanged () НЕ вызывается до тех пор, пока не выполнится Close (), поэтому запись НЕ сохраняется

Любой способ форсировать«Биндер» или любые другие альтернативы?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

По умолчанию Binding UpdateSourceTrigger - это LostFocus, что означает, что ваша привязка обновит нижележащее значение, когда ваш элемент управления потеряет фокус.Вы можете изменить это на PropertyChanged, чтобы он обновлял источник, как только пользователь щелкает по нему (или вводит, если это TextBox).

1 голос
/ 22 марта 2012

Полагаю, UpdateSourceTrigger равно LostFocus, поэтому свойство обновляется, когда элемент управления (filedX) теряет фокус.Например, пользователь щелкает, устанавливает курсор в другой элемент управления.

Одна из возможностей - установить UpdateSourceTrigger в PropertyChanged.

Другой способ - заставить текущий фокусированный элемент обновлятьисточник.

Вот пример для TextBox:

var focusedElement = Keyboard.FocusedElement;
if(focusedElement is TextBox)
{
    var bindingExpression = ((TextBox)focusedElement).GetBindingExpression(TextBox.TextProperty);
    if(bindingExpression != null)
    {
        bindingExpression.UpdateSource();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...