任意に実装したプロパティをBindingSourceに設定する
About
カスタムコントロールや継承クラスを実装し、そのUIの設定のためにXAMLからBindingを実現しようとすると、少々複雑な手順を踏むことになります。例えば、カスタムコントロールや既存のVisualないしControlを継承したクラスに独自の(依存)プロパティを実装したとします。そのプロパティと連動し、UIの外観を変更するようなBindingを実現する場合には、どうしたらよいのでしょうか。ここではその方法について少しだけまとめておきます。
UserControlの場合は、AncestorTypeをUserControlにすれば凡そ解決できるので特に問題になりません。
HowTo
例えば、Gridクラスを継承したCustomGridクラスを実装するとします。Gridには本来Foregroundプロパティは存在しませんが、CustomGridクラスには任意にForegroundプロパティを実装して用意します。すると、このForegroundプロパティを、CustomGridクラスを定義するXAMLの中で、Bindingの対象とするためには、次のようにして記述します。
ここでは仮に、CustomGridクラスの子要素に追加されるTextBlockを対象としたStyleを設定するような例を示します。これでCustomGridクラスのForegroundプロパティに任意の値を設定すると、CustromGridクラスの子要素になるTextBlockの文字色が変更されます。
<Grid x:Class="WpfApplication.CustomGrid" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApplication.CustomGrid" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type local:CustomGrid}}}" /> </Style> </Grid.Resources> </Grid>
自分が含まれる名前空間を示す任意のxmlnsを定義し、x:Typeではそのxmlnsから自身のクラス名を指定するのがポイントです。自身のクラス名だけを宣言しても、エラーが通知されてしまう点に注意する必要があります。またアセンブリ名を"assembly=xxxx;"のようにして、xmlnsのあとに続いて宣言しないことも重要です。