XAML マークアップ拡張を自作する

例えば XAML でデータ バインディングをするときに、

Text="{Binding Message}"

のような記法を用いますが、これは XAML マークアップ拡張と呼ばれ、
Binding クラスが MarkupExtension クラスを継承しているためにこの形式の記述ができるようになっています。

今回は例として、構成ファイル (.config) の <appSettings> の値を読み込む
XAML マークアップ拡張クラスを自作してみたいと思います。
先にコードを示します。

マークアップ拡張クラスでは、ProvideValue メソッドを実装して実際に設定する値を返します。
設定先となる依存関係プロパティを取得するには、
ProvideValue メソッドに渡される serviceProvider から IProvideValueTarget を取り出します。

さて、App.config の <appSettings> に設定値を追加して、
MainWindow.xaml 上の UI コントロールのプロパティにそれらの値を設定します。

クラス名にサフィックスとして Extension を付けておくと、サフィックスを除いた名前で記述できます。
値を設定している部分は、

Height="{local:AppSettings Key=WindowHeight}"

と書いてもよいですが、Key を引数に取るコンストラクターが存在することで、

Height="{local:AppSettings WindowHeight}"

と書けるようになります。
なお、この部分は次のようにも書けます。

<Window>
    <Window.Height>
        <local:AppSettings Key="WindowHeight"/>
    </Window.Height>
</Window>

MarkupExWpf

 

前回: プロパティ変更をタイマーで同期して通知する

作成したサンプル
MarkupExWpf (GitHub)

バージョン情報
C# 6.0
.NET Framework 4.5

参照
MarkupExtension クラス
XAML のマークアップ拡張機能の概要
型コンバーターおよびマークアップ拡張機能で使用できるサービス コンテキスト

コメント / トラックバック1件 to “XAML マークアップ拡張を自作する”

  1. プロパティ変更をタイマーで同期して通知する | Do Design Space Says:

    […] 前回: ExpandoObject を使ったデータ バインディング 次回: XAML マークアップ拡張を自作する […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。