Warning : This page has been marked as an archive because the author consider that its content is no longer relevant.

Lorsque l’on développe des applications XAML on se met assez rapidement à utiliser l’interface INotifyPropertyChanged. Chaque développeur a en général une méthode levant l’évènement PropertyChanged. Dans le cadre de cet article elle sera RaisePropertyChanged.

L’implémentation classique du RaisePropertyChanged est la suivante :

protected virtual void RaisePropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
        handler(this, new PropertyChangedEventArgs(propertyName);
}

L’utilisation de cette méthode se fait donc de cette façon :

private bool _isBusy;
public bool IsBusy
{
    get { return _isBusy; }
    set
    {
        if (value != _isBusy)
        {
            _isBusy = value;
            RaisePropertyChanged("IsBusy");
        }
    }
}

Il arrive aussi très régulièrement que l’on adopte une syntaxe basée sur des expressions lambdas :

private bool _isBusy;
public bool IsBusy
{
    get { return _isBusy; }
    set
    {
        if (value != _isBusy)
        {
            _isBusy = value;
            RaisePropertyChanged(() => IsBusy);
        }
    }
}

L’utilisation de cette syntaxe est très pratique en développement et permet de refactoriser le code sans craindre d’oublier de renommer les noms des propriétés. Elle a cependant un coup non négligeable en performance et en mémoire. Effectivement elle génère des arbres d’expressions qui doivent être analysés pour extraire le nom de la propriété et le tout à l’exécution.

Mon avis sur la question est donc d’utiliser la méthode avec des expressions lambas lorsque le projet débute et qu’il y a encore beaucoup de refactorisation. Ensuite je préfère utiliser la première méthode qui est beaucoup moins coûteuse à l’execution.

La question est donc de savoir comment changer toutes ces expressions lambdas en chaînes de caractères ? Pour un projet simple avec 3 classes c’est rapide à faire à la main, mais sur un projet avec des centaines de classes, faire tout cela à la main est juste inenvisageable.

C’est ici que rentre en scène Visual Studio car lui il sais le faire ! Faut juste savoir lui dire comment.

Si vous allez dans le menu “Edition” puis “Rechercher et remplacer” vous trouverez une action “Remplacer dans les fichiers” (ou alors faites Ctrl+Shift+H c’est plus rapide) vous aurez la possibilité de remplacer du texte en masse. Se cache dans les options de recherche une option très pratique nommée “Expression régulière”. C’est elle qui va nous permettre de remplacer en masse par le bon texte. Cochez donc la case “Expression régulière” et appliquez ensuite la méthode pour votre version de Visual Studio :

Pour Visual Studio 2010 :

Dans le champ de recherche entrez :

RaisePropertyChanged\(\(\) +=\> +{:i}\)

Dans le champ de remplacement entrez :

RaisePropertyChanged("\1")

Si vous utilisez Visual Studio 2011 Beta il faut utiliser d’autres expressions :

Dans le champ de recherche entrez :

RaisePropertyChanged\(\(\) +=\> +(\b(_\w+|[\w-[0-9_]]\w*)\b)\);

Dans le champ de remplacement entrez :

RaisePropertyChanged("$1");

Plus aucune excuse pour générer des arbres d’expressions inutilement à chaque mise à jour de propriétés maintenant !

Comments