RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

C#+XAML:MVVM Light Toolkitの.net Framework4.5(C#5)以上用カスタムスニペット(プロパティ用)

MVVMLight Toolkit純正のスニペット(mvvminpcやmvvminpclambdaなど)では、文字列かラムダ式でプロパティ名を渡しています。 しかし、.net4.5(C#5)ではnameof演算子を使い、メソッド側で呼び元のプロパティ名を取得できるため、実際のところ呼び出し時にプロパティ名は渡す必要がありません。

そのため.net4.5以降のMVVMLight Toolkitでは、RaisePropertyChangedメソッドにnameof演算子を使って実装されたプロパティ名関連の引数を無くしたオーバーロードが実装されています。

今回はmvvminpcをカスタムし、.net4.5以降のMVVMLight Toolkit向けの簡略化されたスニペットの作り方を紹介いたします。(なお、ファイルパスなどの情報はVisual Studio 2015を対象としたものです。)

1;以下の内容でファイルを用意します。名前は「mvvmInpc45.snippet」としておいてください。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>INPC Property</Title>
      <Shortcut>mvvminpc45</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>Type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>bool</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>AttributeName</ID>
          <ToolTip>Attribute name</ToolTip>
          <Default>_myProperty</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>InitialValue</ID>
          <ToolTip>Initial value</ToolTip>
          <Default>false</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>PropertyName</ID>
          <ToolTip>Property name</ToolTip>
          <Default>MyProperty</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[private $Type$ $AttributeName$ = $InitialValue$;

        /// <summary>
        /// Sets and gets the $PropertyName$ property.
        /// Changes to that property's value raise the PropertyChanged event. 
        /// </summary>
        public $Type$ $PropertyName$
        {
            get
            {
                return $AttributeName$;
            }

            set
            {
                if ($AttributeName$ == value)
                {
                    return;
                }

                $AttributeName$ = value;
                RaisePropertyChanged();
            }
        }]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

2:1で用意したファイルを「%UserProfile%\Documents\Visual Studio 2015\Code Snippets\Visual C#\My Code Snippets」に保存します。 または、Visual Studinのメニュー「ツール > コード スニペット マネージャー」より、インポート機能でスニペットを追加します。

3:Visual StudioC#ファイル内で「mvvminpc45」と入力し、タブキーを押してみてください。(インテリセンスに表示されない場合は、Visual Studioを再起動してください)

上記の操作で、下記のような感じのスニペットが展開されたかと思います。

    private bool _myProperty = false;

    /// <summary>
    /// Sets and gets the MyProperty property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public bool MyProperty
    {
        get
        {
            return _myProperty;
        }

        set
        {
            if (_myProperty == value)
            {
                return;
            }

            _myProperty = value;
            RaisePropertyChanged();
        }
    }

mvvminpcよりもすっきりした内容で、.net4.5以降では同機能が利用できます。