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()执行之前不会被调用,因此记录不会保存
有没有办法强制使用"活页夹"或任何其他替代品?
我假设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();
}
}
默认的Binding UpdateSourceTrigger是LostFocus,这意味着当控件失去Focus时,绑定将更新底层值。您可以将其更改为PropertyChanged,这样用户一单击它(或者如果它是TextBox,则键入它),它就会更新源。