给定一个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”或任何其他替代方案?
答案 0 :(得分:1)
我认为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();
}
}
答案 1 :(得分:1)
默认的Binding UpdateSourceTrigger是LostFocus,这意味着当您的控件失去Focus时,绑定将更新底层值。 您可以将其更改为PropertyChanged,以便在用户单击它时立即更新源(或者如果它是TextBox则输入)。