2009-07-16 67 views

回答

11

的的ObservableCollection沒有辦法知道,如果你改變它包含的對象的方式 - 如果你希望收到這些對象時則改變你必須讓這些物體觀察到的,以及(例如讓這些對象實現INotifyPropertyChanged)

+0

好吧。我實現了INotifyPorpertyChanged接口。謝謝 – 2009-07-16 11:02:57

0

可能是因爲項目在編輯時沒有辦法警告集合 - 也就是說它們可能不可觀察。其他類會有類似的行爲 - 無法提醒您引用的類的圖形中的每一個變化。

0

作爲解決方法,您可以從集合中提取對象,然後在完成處理後重新插入它。不過,根據您的要求和併發模型,這可能會讓程序變得醜陋。這是一個快速入門,不適合任何需要質量的東西。

相反,您可以使用專門觸發ContentChanged(不確定名稱)事件的更新方法來實現集合。這並不漂亮,但至少很容易處理。

理想情況下,正如kragen2uk所說,最好是讓對象可觀察並保持客戶端代碼清潔和簡單。

另請參閱this question

+0

提取和重新插入是一個非常好的破解:)現在我知道我必須忘掉這個把戲:) – 2009-07-16 11:01:43

1

實現此目的的另一種方法是您將實現一個從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

+0

看起來有趣,但我不明白你從DependencyObject繼承什麼目的?綁定到WPF內部的依賴屬性應該足夠..或者? – 2010-04-08 09:07:01

1

您可以在視圖模型類中註冊一個方法,以便在數據類對象的PropertyChanged事件中進行註冊,並在數據對象的屬性發生任何更改時在View模型中偵聽它們。當可觀察集合的項目發生更改時,這是在View模型中進行控制的非常簡單直接的方法。希望這有助於...

相關問題