web-dev-qa-db-ja.com

ContentControlのDatatemplate内のデータにバインドする方法

私は次の簡単な例を持っています:

    <Window x:Class="TemplateBinding.MainWindow"
            xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary
                            Source="pack://application:,,,/TemplateBinding;component/PersonTemplate.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
        <Grid>
            <ContentControl ContentTemplate="{StaticResource PersonTemplate}" />
        </Grid>
    </Window>

と:

    <ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">

        <DataTemplate x:Key="PersonTemplate">
            <Border Width="100" Height="100" Background="RosyBrown">
                <TextBlock Text="{Binding Path=FirstName}" VerticalAlignment="Center" TextAlignment="Center"/>
            </Border>
        </DataTemplate>

    </ResourceDictionary>

別のResourceDictionaryファイルのDataTemplateとして。

MainWindowのConstrucorでDataContextを設定し、次のように名を表示するだけで検証しました:<ContentControl Grid.Row="1" Content="{Binding FirstName}"/>

ListBoxでDataTemplateを使用する他のシナリオでは、DataTemplateでまったく同じ方法でBindingを実行し、動作します。

DataTemplateはサイズと背景色を正しく表示するため、バインディング以外は機能していることを知っています。

私は何を間違えていますか? DataTemplateのBindingはどのように見える必要がありますか?

26
markus s

ContentControlのContent- Propertyをバインドする必要があります

<ContentControl Content="{Binding}" ContentTemplate="{StaticResource PersonTemplate}" />

これにより、ContentControlのDataContextがコントロールのコンテンツとして設定されます。

ContentTemplateプロパティのみを設定するだけでは不十分です。 ContentControlは、そのDataContextをコンテンツとして暗黙的に使用しません。

56
Jehof