閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

WPFでデザイン時にのみDataContextを指定する

デザイン サーフェイス上のサンプル データとプロトタイプを作るためのサンプル データ - UWP app developer | Microsoft Docs

に全部書いてある。

特にUserControlなど作っているときに、ViewModelは外から設定されるのでDataContextは設定したくない、けどないとインテリセンスなど効かなくて不便、という場合。

<UserControl.DataContext>
  <local:ViewModel/>
</UserControl.DataContext>

などと書くとUserControl生成時にViewModelもインスタンス化されてしまい、親コントロールからDataContextを設定されるようなケースだと無駄なインスタンスができてしまう。

<UserControl
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  mc:Ignorable="d"
  ...
  d:DataContext="{d:DesignInstance local:MainViewModel}">

そういった場合は上記のようにd:DataContext属性を使う。mc:Ignorable属性に指定されているプリフィクスは無視されるのでインスタンスは重複しない。ただこれだとプレビュー時にもインスタンス化されず、値が見えないので少し不便。デザイナから見る時だけインスタンス化したい場合はIsDesignTimeCreatable属性をTrueにする。

<UserControl
  ..
  d:DataContext="{d:DesignInstance local:MainViewModel, IsDesignTimeCreatable=True}">

…ということが、公式ドキュメントも一番上に載せたページくらいしか見当たらず。Blend SDKにリファレンスって無いのでしょうか……。