2009-03-05 84 views
1

我處於從外部來源獲知特定實體已在當前數據上下文外被更改的情況。我能找到的實體,並調用刷新,像這樣DataContext刷新和PropertyChanging&PropertyChanged事件

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues,myEntity所);

並且在實體上被更改的屬性被正確更新。但是,當刷新發生時,INotifyPropertyChanging INotifyPropertyChanged都不會引發,這會讓我的UI顯示不正確的信息。

我知道,刷新()沒有使用正確的屬性getter和setter的實體,以提高變更通知事件,但也許有另一種方式來完成同樣的事情嗎?

我做錯了什麼? 有沒有比Refresh更好的方法? 如果刷新是唯一的選擇,是否有人有工作?

回答

2

我有類似的問題。我綁定到一個TreeView並需要調用Refresh來響應用戶取消編輯操作。 Refresh()方法乖乖地放回所有的原始值,但這並沒有反映在我的TreeView UI中。與谷歌全能協商後,我遇到了這個解決方案:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh(); 

這似乎迫使我的TreeView更新一切。唯一的缺點(它是一個非常重要的缺點)是它似乎摺疊了所有樹節點,導致用戶失去他們的位置。我也可以將我的ItemsSource設置爲null,然後再返回...效果相同,但如果您有一堆綁定的文本框或其他東西,則此方法會更簡單,因爲您不需要重新綁定每一個文本框。

有沒有比這更好的解決方案?

編輯: 是的,有...

更智能的超我我的同事想出了這個解決方案,這似乎這樣的伎倆。在爲LINQ2SQL對象的部分類,添加以下代碼:

public void SendPropertiesChanged() 
{ 
    foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties()) 
    SendPropertyChanged(prop.Name); 
} 

的你可以調用這個應用程序中的代碼:

context.Refresh(RefreshMode.OverwriteCurrentValues, employee); 
employee.SendPropertiesChanged(); 

所有UI元素得到的消息,並適當地更新自己。這甚至適用於樹視圖控件以及類似的情況,在刷新綁定時不希望UI看起來「重置」。

0

如果您知道要調用Refresh(),爲什麼不直接繼續刷新UI?

PropertyChanging和的PropertyChanged通過調用在LINQtoSQL DBML生成實體類的setter調用。調用Refresh()不會這樣做:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)] 
public string DisplayName 
{ 
    get 
    { 
     return this._DisplayName; 
    } 
    set 
    { 
     if ((this._DisplayName != value)) 
     { 
      this.OnDisplayNameChanging(value); 
      this.SendPropertyChanging(); 
      this._DisplayName = value; 
      this.SendPropertyChanged("DisplayName"); 
      this.OnDisplayNameChanged(); 
     } 
    } 
} 
+0

雷克斯, 刷新()是在控制器/「幾乎業務層」層面進行,其遠不及UI所以手動刷新是出了問題。 如果Refresh()更改了Enitity數據,它應該引發更改的事件 - 事實上,它不會執行它對我來說似乎是一個粗略的監督。 – Scott 2009-03-05 03:27:03