2010-08-05 39 views

回答

0

當然。如果你的個人實施INotifyPropertyChanged,那麼你可以註冊並聽取它。

基本上,您的個人項目應該實施更改的財產。這裏是一個小部件,它可以這樣做:

public class Widget : INotifyPropertyChanged 
{ 
    private int _id; 

    public int Id 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      RaisePropertyChanged("Id"); 
     } 
    } 

    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 



    private void RaisePropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

接下來,您需要管理可觀察集合並註冊到集合更改事件。當添加小部件時,您會掛鉤到屬性更改。當它們被移除時,您將取消掛鉤:

public class WidgetViewModel 
{ 
    public WidgetViewModel() 
    { 
     Widgets = new ObservableCollection<Widget>(); 
     Widgets.CollectionChanged += Widgets_CollectionChanged; 
    } 

    void Widgets_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e != null && e.NewItems != null) 
     { 
      foreach (var widget in e.NewItems.OfType<Widget>()) 
      { 
       widget.PropertyChanged += WidgetViewModel_PropertyChanged; 
      } 
     } 

     if (e != null && e.OldItems != null) 
     { 
      foreach(var widget in e.OldItems.OfType<Widget>()) 
      { 
       widget.PropertyChanged -= WidgetViewModel_PropertyChanged; 
      } 
     } 
    } 

    void WidgetViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     switch(e.PropertyName) 
     { 
      case "Id": 
       break; 
      case "Name": 
       break; 
      default: 
       break; 
     } 
    } 
    public ObservableCollection<Widget> Widgets { get; private set; } 
} 

在屬性更改中,您可以處理正在發生的任何事情。