2010-08-05 5 views

Répondre

0

Bien sûr. Si votre individu implémente INotifyPropertyChanged, vous pouvez l'enregistrer et l'écouter.

Fondamentalement, vos éléments individuels doivent implémenter la propriété modifiée. Voici un Widget qui fait cela:

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; 
} 

Ensuite, vous devez gérer la collecte observable et enregistrer des événements de changement de collection. Lorsque des widgets sont ajoutés, vous vous connectez au changement de propriété. Quand ils sont enlevés, vous décrochez:

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; } 
} 

Dans le changement de propriété, vous pouvez traiter tout ce qui se passe.

Questions connexes