【问题标题】:IsDirty using INotifyPropertyChanged for EF entityIsDirty 为 EF 实体使用 INotifyPropertyChanged
【发布时间】:2012-04-07 04:21:09
【问题描述】:

给定一个使用 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”或任何其他替代方法?

【问题讨论】:

  • 上面的两个答案都没有抓住重点。当您按下“保存并关闭”按钮时,任何其他控件都将失去焦点,将发生绑定并触发 PropertyChange。我根据您的描述创建了一个简单的测试应用程序,一切正常。不幸的是,这意味着我无法为您提供解决方案。你能发布更多代码/xml吗?
  • 当然要说明的另一点是实体框架 ObjectContext 正在为您跟踪所有更改,因此您只需调用 myEntities.SaveChanges(),因为它已经知道一个对象是脏的。
  • @Phil button_click 在 entity_PropertyChanged 之前被调用,这就是问题所在
  • 您使用的是什么版本的 .net 等?
  • @Phil .net 4,与 2010 相比,虽然这个 shd 没有影响,但我隐约记得很久以前在 winforms 中类似的东西

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


【解决方案1】:

我想UpdateSourceTriggerLostFocus,所以当控件(filedX)失去焦点时属性会更新。例如。用户单击会将光标设置到另一个控件中。

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

另一种方法是强制当前焦点元素更新源。

这是一个文本框的示例:

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

【讨论】:

  • GetBindingExpression() 无论出于何种原因总是返回 null,有什么想法吗?
  • 应该是您传递给方法的属性的绑定吗?
  • 是的,这就是为什么它如此令人惊讶,关于如何调试它的任何想法?或者也许获取控件的绑定列表?
  • 如果您为控件的属性分配一个具体值,您将失去绑定。在这种情况下,绑定将为空。但我认为情况并非如此。
  • 您是否尝试更改UpdateSourceTrigger 来解决您最初的问题?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 2021-04-14
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2011-04-08
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多