对于EF实体使用INotifyPropertyChanged的IsDirty

时间:2012-03-22 15:12:53

标签: c# .net wpf entity-framework data-binding

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

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

任何方式强制“Binder”或任何其他替代方案?

2 个答案:

答案 0 :(得分:1)

我认为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();
    }
}

答案 1 :(得分:1)

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