IsDirty正在使用EF实体的INotifyPropertyChanged

本文关键字:实体 INotifyPropertyChanged EF IsDirty | 更新日期: 2023-09-27 18:28:53

给定一个使用WPF双向绑定到EF实体对象的std记录编辑表单

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并点击保存(在这种情况下这是一个有效的模型!)

问题是PropertyChanged()在Close()执行之前不会被调用,因此记录不会保存

有没有办法强制使用"活页夹"或任何其他替代品?

IsDirty正在使用EF实体的INotifyPropertyChanged

我假设UpdateSourceTriggerLostFocus,所以当控件(filedX)失去焦点时,属性会更新。例如,用户点击将光标设置为其他控件。

一种可能性是,将UpdateSourceTrigger设置为PropertyChanged

另一种方法是强制当前关注的元素更新源。

下面是一个TextBox的例子:

var focusedElement = Keyboard.FocusedElement;
if(focusedElement is TextBox)
{
    var bindingExpression = ((TextBox)focusedElement).GetBindingExpression(TextBox.TextProperty);
    if(bindingExpression != null)
    {
        bindingExpression.UpdateSource();
    }
}

默认的Binding UpdateSourceTrigger是LostFocus,这意味着当控件失去Focus时,绑定将更新底层值。您可以将其更改为PropertyChanged,这样用户一单击它(或者如果它是TextBox,则键入它),它就会更新源。