EntityFramework EntityState和数据绑定以及INotifyPropertyChanged

时间:2010-04-08 22:11:04

标签: wpf entity-framework data-binding inotifypropertychanged

我有一个显示Shipment实体的WPF视图。我有一个包含星号的文本块,它会提醒用户记录已更改但未保存。我原本希望将此(使用转换器)的可见性绑定到Shipment.EntityState属性。

If value = EntityState.Modified Then
    Return Visibility.Visible
Else
    Return Visibility.Collapsed
End If

该属性更新得很好,但视图不知道更改。我需要知道的是,如何让UI接收属性更改的通知。如果无法做到这一点,是否有一种很好的方法来编写我自己的IsDirty属性来处理编辑撤消(即如果我更改属性的值,然后将其更改回原始属性,它不会被视为编辑,并且状态保持不变)。

任何帮助,一如既往,将不胜感激。

科里

2 个答案:

答案 0 :(得分:2)

稍微努力解决同样的问题之后,这是一个适合我的解决方案。 假设我有一个名为Trip的实体,由EF生成,我只需要通过部分类来扩展类,如下所示。当您需要强制刷新EntytyState属性时,例如在调用上下文的SaveChanges方法之后,RaiseEntityStateChanged方法很有用。

partial class Trip
{
   bool _forced = false;
   System.Data.EntityState _lastState;

   public Trip()
   {
     _lastState = EntityState;
     this.PropertyChanged += (s, e) => 
     {
       if (_lastState != this.EntityState && e.PropertyName != "EntityState" || _forced)
       {
          _forced = false;
          OnPropertyChanged("EntityState");
       }

       _lastState = this.EntityState;
    };
  }

  public virtual void RaiseEntityStateChanged()
  {
     _forced = true;
     OnPropertyChanged("EntityState");
  }
}

答案 1 :(得分:1)

我没有看到在现有属性上创建XAML绑定以执行您尝试执行的操作的方法。但是你可以根据EntityState编写自己的IsDirty属性;您可以通过订阅基本EntityObject引发的PropertyChanged事件来更新此值。当然,您还需要为IsDirty引发一个PropertyChanged事件(以便通知GUI)并在处理程序中忽略此事件(以防止无限递归)。 编辑:OP之后添加以下问题:

这是我看到它的方式,以回答评论。

在货件类中,可以添加:

public bool IsDirty { get { return EntityState == EntityState.Modified; } }

public Shipment() {
...
PropertyChanged += OnShipmentChanged;
}

private void OnShipmentChanged(object sender, PropertyChangedEventArgs pcea) {
    if (pcea.PropertyName != "IsDirty") { // prevent recursion
        OnPropertyChanged("IsDirty"); // notifies binding listener that the state has changed
    }
}

在夜晚,我想到了另一种方法,即在每个Shipment属性上创建一个多重绑定(它将取代IsDirty属性的整个概念,并实际回答原始问题)。如果只有几个Shipment属性,这可能是有意义的。我想如果有超过3个,我们应该忘记这个想法。

相关问题