2

我有一個顯示Shipment實體的WPF視圖。我有一個包含星號的文本塊,它會提醒用戶記錄已更改但未保存。我原本希望將此(與轉換器)的可見性綁定到Shipment.EntityState屬性。EntityFramework EntityState和數據綁定以及INotifyPropertyChanged

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

該屬性得到更新就好,但視圖是無知的變化。我需要知道的是,我怎樣才能讓UI獲得財產變更的通知。如果這不能完成,是否有一種編寫我自己的IsDirty屬性的好方法來處理編輯撤消(即,如果我更改屬性的值,然後將其更改回原來的屬性,則不會將其計算爲編輯,並且狀態保持不變)。

任何幫助,一如既往,將不勝感激。

科里斯

回答

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 
    } 
} 

在晚上,我想到了另外一個辦法,這是建立在每個裝運財產多結合(這將取代這整個概念一個IsDirty屬性,並會實際回答原始問題)。如果只有幾個貨運屬性,這可能是有意義的。我想說,如果有超過3個,我們應該忘記這個想法。

+0

如何聽一個在另一個類中引發的事件,比如一個實體?我嘗試在發貨實體類中創建一個事件處理程序,然後在ViewModel中創建一個事件處理程序,但沒有運氣。對不起,問這個問題,但我不知道,谷歌今天早上對我不友善。 Cory – CodeWarrior 2010-04-09 14:58:47

+0

請看看編輯過的答案。 – Timores 2010-04-09 15:18:07

+0

我正在將你的上面的代碼翻譯成VB.NET,而我被困在這個:PropertyChanged + = OnShipmentChanged ;.那是幹什麼的?我知道+ =只是將指示的值添加到當前值,但調試器對此表示異常。 – CodeWarrior 2010-04-09 16:58:59

2

經過一段時間的相同的問題掙扎後,這裏是一個解決方案,爲我工作。 假設我有一個由EF生成的名爲Trip的實體,我只需要通過部分類來擴展該類,如下所示。例如,在調用上下文的SaveChanges方法之後,需要強制刷新EntytyState屬性時,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"); 
    } 
} 
相關問題