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 のデザイナー上で、
Background
や Height
など意匠設計に強く関わる初期値を
扱いたい場合に色なら真っ白、数値なら 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 で定義済みのキーへのインテリセンス補完と 値の参照が有効になる。
Background
や Height
などに MySettings の値が束縛された状態でプレビューされ、
.setting を DataContext
として束縛する場合の XAML のデザインタイムにおける"期待動作" が得られ快適になる😃