C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

XAML: DataContext へ Properties/MySettings.settings を XAML だけで完結して束縛する方法

前提: Visual Studio 2017 でプロジェクトを作成してWPFアプリをデザイナーを使って作る際のはなし。

1. はじめに。 C# コードで束縛する場合

// 例えば MainWindow の DataContext へ
// MainWindow の ctor で Properties/MySettings.settings に
// 用意した MySettings.settings を束縛する場合
namespace MyApp
{
  public partial class MainWindow: Window
  {
    public MainWindow()
    {
      InitializeComponent();
      DataContext = Properties.MySettings.Default; // <-- ここ
    }
  }
}

MyApp プロジェクトへ Properties/MySettings.settings として用意(作成)した .settings のそれは、 C# ソースコードでは Properties 名前空間MySettings クラスの Default プロパティーget アクセサーからアクセスできる。

どうしてそれでアクセスできるかは Solution Explorer で用意(生成)した Properties/MySettings.settings のツリーを もう1段階だけ展開すると視えるようになる MySettings.Designer.cs のソースを読むとわかる。

コードで束縛する場合の問題点

C# コードで束縛を書くと非常に明快で簡潔な記述で済むが、 実行時まで評価されないので XAML のデザイナー上で、 BackgroundHeight など意匠設計に強く関わる初期値を 扱いたい場合に色なら真っ白、数値なら 0 など悲しい値が仮定された状態の デザイナーと戦う事になってしまう😅

2. ほんだい。XAML だけで完結して束縛する方法

a. ごく一部の値だけ直接束縛できればよい場合

一応もののついで、比較というほどでもないが例示しておくことに。

<Window
  xmlns:P="clr-namespace:MyApp.Properties"
  ...
>
  ...
  <TextBlock Text="{Binding MyPropertyKey,Source={x:Static P:MySettings.Default}}"/>

b. DataContext として束縛した上で使いたい場合

ほんだいのほんだい。

<Window
  xmlns:P="clr-namespace:MyApp.Properties"
  ...
  DataContext="{Binding Source={x:Static P:MySettings.Default}}"
>
  ...
  <TextBlock Text="{Binding MyPropertyKey}"/>

何れの場合も、 XAML を編集する前に MySettings.settings (厳密には MySettings.Designer.cs )が翻訳されていれば、 波線など出ず、また XAML のデザイナー上でもさっそく MySettings で定義済みのキーへのインテリセンス補完と 値の参照が有効になる。

BackgroundHeight などに MySettings の値が束縛された状態でプレビューされ、 .setting を DataContext として束縛する場合の XAML のデザインタイムにおける"期待動作" が得られ快適になる😃