Snippet pour propriété notifiée

MAJ 15/02/2013 : VS2012 ne prenait pas en compte les noms accentués (même avec des CDATAs). C’est Ok maintenant.
Ce code est parfait pour une app WP7 ou toutes autres applications écrites en C# dont la version est inférieur à 5. Sinon pour WP8 par exemple on lui préférera une implémentation avec l’attribut CallerMemberName qui modifie juste la méthode RaisePropertyChanged et nous permet de ne plus avoir à utiliser de constante.

        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

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

On appelle la méthode directement sans argument depuis la propriété (ou avec la chaine si on est en dehors de celle ci) !
L’attribut sera capable de mettre tout seul le nom de la propriété d’où il est appelé.

 this.RaisePropertyChanged();

(Petit coucou à Benjamin Roux)

Article original

Vous trouverez ci-joint un petit snippet permettant de créer une propriété notifiée, c’est à dire qui utilise la méthode mise en place pour accéder à l’évenement PropertyChanged de l’interface INotifyPropertyChanged.
Le snippet s’appelle propnoti et est à utiliser sans modération lors de la mise en place du pattern MVVM.

Voici un exemple généré pour une classe User et une propriété SelectedUser :

        /// <summary>
        /// Nom de la propriété SelectedUser
        /// </summary>

        public const string SelectedUserPropertyName = "SelectedUser";

        /// <summary>
        /// propriété SelectedUser :  
        /// </summary>

        public User SelectedUser
        {
            get
            {
                return this._SelectedUser;
            }

            set
            {
                if (this._SelectedUser != value)
                {
                    this._SelectedUser = value;
                    this.RaisePropertyChanged(SelectedUserPropertyName);
                }
            }
        }

        private User _SelectedUser = null;

Notez la constante du nom de la propriété qui peut être réutilisable par exemple lors de l’utilisation de l’évenement PropertyChanged.

Enfin, le code du snippet en lui même (que vous pouvez enregistrer dans un fichier .snippet):

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>propnoti</Title>
      <Shortcut>propnoti</Shortcut>
      <Description>Propriete notifiee</Description>
      <Author>Samuel Blanchard</Author>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>PropertyName</ID>
          <Type />
          <ToolTip>Nom de la propriete</ToolTip>
          <Default>MyProperty</Default>
          <Function />
        </Literal>
        <Literal Editable="true">
          <ID>PropertyType</ID>
          <Type />
          <ToolTip>Type de la propriete</ToolTip>
          <Default>string</Default>
          <Function />
        </Literal>
        <Literal Editable="true">
          <ID>DefaultValue</ID>
          <Type />
          <ToolTip>Valeur par defaut de la propriete</ToolTip>
          <Default>null</Default>
          <Function />
        </Literal>
        <Literal Editable="true">
          <ID>Description</ID>
          <Type />
          <ToolTip />
          <Default></Default>
          <Function />
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[        /// <summary>
        /// Nom de la propriete $PropertyName$
        /// </summary>

        public const string $PropertyName$PropertyName = "$PropertyName$";

        /// <summary>
        /// propriete $PropertyName$ : $Description$
        /// </summary>

        public $PropertyType$ $PropertyName$
        {
            get
            {
                return this._$PropertyName$;
            }

            set
            {
                if (this._$PropertyName$ != value)
                {
                    this._$PropertyName$ = value;
                    this.RaisePropertyChanged($PropertyName$PropertyName);
                }
            }
        }

		private $PropertyType$ _$PropertyName$ = $DefaultValue$;]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Généralement, j’utilise la méthode RaisePropertyChanged pour déclencher l’évenement PropertyChanged mais rien n’empêche évidemment de changer son nom dans le snippet afin qu’elle s’adapte à vos habitudes de développement.

Pour plus d’info sur les snippets et notamment comment les intégrer dans Visual Studio je vous conseille ce tuto :
http://dotnet.dzone.com/news/code-snippets-visual-studio

Le fichier complet se trouve ici !

leave your comment