我注意到,WPF中的ObservableCollection
僅通過添加或刪除列表中的項目來反映GUI的更改,但不是通過編輯它。爲什麼ObservableCollection未更新項目更改?
這意味着我必須改寫我的自定義類MyObservableCollection。 這種行爲的原因是什麼?
感謝
我注意到,WPF中的ObservableCollection
僅通過添加或刪除列表中的項目來反映GUI的更改,但不是通過編輯它。爲什麼ObservableCollection未更新項目更改?
這意味着我必須改寫我的自定義類MyObservableCollection。 這種行爲的原因是什麼?
感謝
的的ObservableCollection沒有辦法知道,如果你改變它包含的對象的方式 - 如果你希望收到這些對象時則改變你必須讓這些物體觀察到的,以及(例如讓這些對象實現INotifyPropertyChanged)
可能是因爲項目在編輯時沒有辦法警告集合 - 也就是說它們可能不可觀察。其他類會有類似的行爲 - 無法提醒您引用的類的圖形中的每一個變化。
作爲解決方法,您可以從集合中提取對象,然後在完成處理後重新插入它。不過,根據您的要求和併發模型,這可能會讓程序變得醜陋。這是一個快速入門,不適合任何需要質量的東西。
相反,您可以使用專門觸發ContentChanged(不確定名稱)事件的更新方法來實現集合。這並不漂亮,但至少很容易處理。
理想情況下,正如kragen2uk所說,最好是讓對象可觀察並保持客戶端代碼清潔和簡單。
另請參閱this question。
提取和重新插入是一個非常好的破解:)現在我知道我必須忘掉這個把戲:) – 2009-07-16 11:01:43
實現此目的的另一種方法是您將實現一個從DependencyObject派生的新XXXViewModel類,並將其放入ObservableCollection中。
該看看這個非常好的MVVM介紹:http://blog.lab49.com/archives/2650
對於這樣一類的例子是:
public class EntryViewModel : DependencyObject
{
private Entry _entry;
public EntryViewModel(Entry e)
{
_entry = e;
SetProperties(e);
}
private void SetProperties(Entry value)
{
this.Id = value.Id;
this.Title = value.Title;
this.CreationTimestamp = value.CreationTimestamp;
this.LastUpdateTimestamp = value.LastUpdateTimestamp;
this.Flag = value.Flag;
this.Body = value.Body;
}
public Entry Entry
{
get {
SyncBackProperties();
return this._entry;
}
}
public Int64 Id
{
get { return (Int64)GetValue(IdProperty); }
set { SetValue(IdProperty, value); }
}
// Using a DependencyProperty as the backing store for Id. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IdProperty =
DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64()));
}}
這裏重要的事情: - 它自DependencyObject 派生 - 它與操作DependencyProperties支持WPF數據綁定
br sargola
看起來有趣,但我不明白你從DependencyObject繼承什麼目的?綁定到WPF內部的依賴屬性應該足夠..或者? – 2010-04-08 09:07:01
您可以在視圖模型類中註冊一個方法,以便在數據類對象的PropertyChanged事件中進行註冊,並在數據對象的屬性發生任何更改時在View模型中偵聽它們。當可觀察集合的項目發生更改時,這是在View模型中進行控制的非常簡單直接的方法。希望這有助於...
好吧。我實現了INotifyPorpertyChanged接口。謝謝 – 2009-07-16 11:02:57