2010-08-05 42 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; } 
} 

在属性更改中,您可以处理正在发生的任何事情。