Collection observable surveillant les modifications aux items

J'ai été confronté à une situation lors d'un développement d'une application WPF qui utilisait la classe ObservableCollection, voici la description:

Problème:

Collection d'items qui comporte plusieurs items (qui eux implémente l'interface INotifyPropertyChanged). Je dois faire certains calculs: Total des items à complétés, total des items complétés, items restants, etc. Mais lorsque qu'un de ces items changeait de statut et devenait complété, impossible de pousser l'information (push) à un niveau supérieur.

Solution proposée:

Utilisation d'un thread qui à chaque intervalle X, allez valider les totaux et mettre à jour les données sur l'interface, de façon tirer (pull). N'aimant pas vraiment cette idée et essayant de diminuer au minimum les pull pour privilégier les push, j'ai fait une petite recherche sur le sujet.

Solution implémentée:

J'ai trouvé la une solution sur StackOverflow, qui dérivait de ObservableCollection et implémentait l'interface INotifyPropertyChanged, soit la classe  ObservableCollectionEx<T>. Voici la classe en tant que telle:

 

public class ObservableCollectionEx : ObservableCollection where T : INotifyPropertyChanged 
  { 
    public ObservableCollectionEx() 
      : base() 
    { 
    } 
 
    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
      Unsubscribe(e.OldItems); 
      Subscribe(e.NewItems); 
      base.OnCollectionChanged(e); 
    } 
 
    private void Subscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged += (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void Unsubscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged -= (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void ContainedElementChanged(PropertyChangedEventArgs e) 
    { 
      OnPropertyChanged(e); 
    }
}

Très simple et surtout générique. Pour l'utilisation, soren.enemaerke (l'auteur original) propose ce petit bout de code:

ObservableCollectionEx collection = new ObservableCollectionEx(); 
((INotifyPropertyChanged)collection).PropertyChanged += (x,y) => ReactToChange();

Ce que je n'ai pas encore expérimenté, c'est d'étendre cette classe pour offrir un peu plus de fonctionnalités qui serait très utile, ce sera pour une prochaine fois.

PRISM et les contrôles Telerik RadControls for WPF

Depuis quelques temps, j'ai eu la chance d'expérimenter PRISM et j'aime bien ce que ce dernier apporte. Mais j'utilise aussi certains contrôles de Telerik pour WPF, en faisant quelques recherches, j'ai remarqué que Telerik à mis à même sa documentation des éléments sur PRISM.

Voici quelques liens intéressants:

Si vous avez d'autres articles intéressants, faites le moi savoir via les commentaires ou ma page de contact

Visual Studio Power Tools, Code Compare et PowerCommands

Voici une collection d'outils/plugins/utilitaires permettant de travailler encore plus efficacement avec VS2010, voici les 3 que j'installe avec VS2010. Puisque vous y êtes, allez donc faire un tour sur le Visual Studio Gallery, vous allez sûrement trouver quelque chose d'intéressant!

Visual Studio 2010 Pro Power Tools

Nouvellement arrivé, le Pro Power Tools permettent entre autre une meilleure gestion des onglets (par projet, code de couleur, scroll, stack, ...) ainsi que la recherche dans le menu Add Reference, ce qui est assez chouette, et j'ai même remarqué une amélioration des performances de ce dialogue.

PowerCommands for VS2010

Si vous ne l'avez pas, vous devez allez le chercher!!! Celui-ci ajoute des commandes(comme copier/coller un projet) qui sont vraiment utile.

Code Compare

Pour ceux qui ne comprenne pas l'anglais, Code Compare permet de comparer du code. Quoi dire de plus? À oui: il est intégré à VS2010