14

esでラップされたすべてのアイテムを取りItemsSource、表示するコントロールを作成しようとしています。InnerTemplateCheckBox

コントロールには 2 つの依存関係プロパティがあります。

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckBoxWrapperList), null);
public static readonly DependencyProperty InnerTemplateProperty = DependencyProperty.Register("InnerTemplate", typeof(DataTemplate), typeof(CheckBoxWrapperList), null);

テンプレートは次のとおりです。

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{TemplateBinding InnerTemplate}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

ただし、このアプローチは機能しません。使用
中のバインディングは機能しません。 ただし、テンプレート バインディングを使用せず、テンプレートを静的リソースとして参照すると、期待どおりに機能します。ControlPresenter.ContentTemplateTemplateBinding

  • datatemplate のコンテンツ プレゼンター内でテンプレート バインディングを使用できないのはなぜですか?
  • ここで何が欠けていますか?特別なマークアップが必要ですか?
  • 期待される動作を実現する方法はありますか?

前もって感謝します。

4

2 に答える 2

21

Silverlight と WPF

これは、相対ソース バインディングで回避できます。

それ以外の:

{TemplateBinding InnerTemplate}

以下を使用します。

{Binding RelativeSource={RelativeSource AncestorType=local:CheckBoxWrapperList}, Path=InnerTemplate}

少し面倒ですが、機能します。

WinRT

WinRT には AncestorType がありません。動作するものがありますが、ちょっと恐ろしいです。

添付プロパティを使用して TemplateBinding 値を格納し、ElementName を使用してアクセスできます...

<ControlTemplate TargetType="local:CheckBoxWrapperList">
    <Grid x:Name="TemplateGrid" magic:Magic.MagicAttachedProperty="{TemplateBinding InnerTemplate}">
        <Grid.Resources>
            <DataTemplate x:Key="wrapper">
                <CheckBox>
                    <ContentPresenter ContentTemplate="{Binding ElementName=TemplateGrid, Path=(magic:Magic.MagicAttachedProperty)}" Content="{Binding}" />
                </CheckBox>
            </DataTemplate>
        </Grid.Resources>
        <ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
    </Grid>
</ControlTemplate>

WinRT のより良い方法があるかどうかはわかりません。

于 2012-03-20T02:08:12.920 に答える
13

TemplateBinding は ControlTemplate 内でのみ使用できます。DataTemplate 内で使用しています。(DataTemplate が ControlTemplate 内にあるという事実は問題ではありません)

于 2011-07-19T16:05:30.773 に答える