我有一个显示Shipment实体的WPF视图。我有一个包含星号的文本块,它会提醒用户记录已更改但未保存。我原本希望将此(使用转换器)的可见性绑定到Shipment.EntityState属性。
If value = EntityState.Modified Then
Return Visibility.Visible
Else
Return Visibility.Collapsed
End If
该属性更新得很好,但视图不知道更改。我需要知道的是,如何让UI接收属性更改的通知。如果无法做到这一点,是否有一种很好的方法来编写我自己的IsDirty属性来处理编辑撤消(即如果我更改属性的值,然后将其更改回原始属性,它不会被视为编辑,并且状态保持不变)。
任何帮助,一如既往,将不胜感激。
科里
答案 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个,我们应该忘记这个想法。