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

Le TextFieldParser

Éric Moreau à écrit un article sur une composante intéressante que je ne connaissais pas (disponible depuis le 2.0): le TextFieldParser. Celle-ci fournit des méthodes et des objets permettant de parcourir les fichiers texte structurés (i.e. .CSV).

Malheureusement, Microsoft ont inclus cette dans l'extension Microsoft.VisualBasic.dll. Même si on peut ajouter cette extension en C#, celle-ci n'est pas vraiment spécifique au VB.

Bonne lecture

 

Composite Application Library (PRISM) et Silverlight(WPF)

Depuis quelques temps, j'expérimente avec Silverlight et PRISM. Si vous êtes curieux comme moi voici quelques liens pour vous aider à commencer:

Bonne chance, et si vous avez d'autres liens, n'hésitez pas à laissez un commentaire!

ResourceBlender

ResourceBlender est un utilitaire permettant de faire la traduction de vos chaînes de caractères très aisément (vous pouvez même utiliser Google Translate automatiquement, si vous être paresseux ou n'avez pas de haut standard de qualité de traduction). 

Il peut générer des fichiers RESX (.Net), Java, XML, etc ... En plus d'avoir des fonctions d'importation et de réutilisation des chaines de caractères déjà traduite. Voir toutes les fonctionnalités ici...

Le code source se trouve évidemment sur Codeplex