Top > Programming > .NetFramework > WPF > Binding > SetCustomControlOrInheritClassAsBindingSource
Last-modified: Fri, 26 Apr 2013 07:59:46 JST
Counter:3953 Today:1 Yesterday:0 Online:8
このエントリーをはてなブックマークに追加

任意に実装したプロパティを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のあとに続いて宣言しないことも重要です。

Reference