2009-07-06 57 views
1

有沒有辦法在任何對象上觀察對象圖的變化,並根據變化做些事情?觀察對象圖的變化

可以說我有以下幾點:

public class Main:INotifyPropertyChanged 
{ 
    public ObservableCollection<Foo> FooItems { get; } 
    public ObservableCollection<Bar> BarItems { get; } 
} 

public class Foo:INotifyPropertyChanged 

public class Bar:INotifyPropertyChanged 
{ 
    public ObservableCollection<Other> OtherItems { get; } 
} 

public class Other:INotifyPropertyChanged 

會是什麼,實現跨越所有對象的某種變化通知系統的最好方式?例如自動保存,其中任何更改都會觸發系統序列化Main類。

我應該在Main課上看膠水代碼,看BarItems的變化,連接到他們的PropertyChanged?這看起來有點亂,而且容易出錯。有沒有更好的辦法?

回答

3

而不是提高他們自己的屬性更改事件的對象,也許他們可以提出共享事件。例如:

public class SharedChangeNotifier 
{ 
    public static event EventHandler<DataChangedEventArgs> SharedChangeEvent; 

    protected void RaiseChangeEvent() 
    { 
     if (SharedChangeNotifier.SharedChangeEvent != null) 
     { 
      SharedChangeNotifier.SharedChangeEvent(
       this, new DataChangedEventArgs()); 
     } 
    } 
} 

public class Foo : SharedChangeNotifier 
{ 
    public int MyProperty 
    { 
     get { ... } 
     set 
     { 
      ... 
      RaiseChangeEvent(); 
     } 
    } 
} 

然後,您可以附加一個事件處理程序,以靜態SharedChangeNotifier的SharedChangeEvent通知,每當從SharedChangeNotifier派生的任何對象改變,如:

SharedChangeNotifier.SharedChangeEvent += (sender, args) => { 
    DoWhatever(); 
}; 
+0

我可以做到這一點,但我也使用INotifyPropertyChanged接口進行數據綁定,所以這將是很好的你已經有什麼了。但我會記住這一點。 – 2009-07-06 08:44:03

0

我已經做了它的方式在過去是創建一個單獨的ChangeTracker類,並在其中註冊對象。在該方法內部,使用反射來探索註冊對象,並將其掛鉤到實現INotifyPropertyChanged的每個屬性上的事件中。

然後,您可以向ChangeTracker添加方法來詢問狀態,例如, IsDirty(),甚至在ChangeTracker上實現INotifyPropertyChanged。

(請務必在ChangeTracker上實現並使用IDisposable,並在當時刪除所有事件處理程序)。

0

你可以有針對執行INotifyPropertyChanged事件的所有物品一樣處理:

foreach (INotifyPropertyChanged obj in FooItems) 
    obj.PropertyChanged+= this.modified; 

// likewise for bar items, and when items are added 

private void modified(object sender, EventArgs args) 
{ 
    this.Save(); 
} 

編輯>爲了做同樣的當增加一個項目:

private void addToList<T>(ref List<T> l, T item) where T : INotifyPropertyChanged 
{ 
    item.PropertyChanged += this.modified; 
    l.Add(item); 
} 

調用它使用:

Foo item = new Foo(); 
List<Foo> fooItems = new List<Foo>(); 

addToList<Foo>(ref fooItems, item); 
+0

什麼時候添加或刪除FooItems項目? – 2009-07-06 23:07:28