3

私はSilverlightコントロールを構築しており、それぞれのDataTemplatesを介してHeaderとBodyContentControlsのバインディングを設定しようとしています。理由はわかりませんが、これは機能しません(サイレントに失敗します)。私の唯一の推測は、DataTemplatesがStaticResourcesであるためだと思います。誰かアドバイスはありますか?コントロールには、次のデフォルトテンプレートがあります。

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel>
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                           <TextBlock Text="{Binding HeaderText}" FontSize="15"/>
                        </StackPanel>
                    </DataTemplate>

                    <DataTemplate x:Key="DefaultBodyTemplate">
                        <StackPanel>
                            <TextBlock Text="{Binding BodyText}" FontSize="12"/>
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" 
                   ContentTemplate="{StaticResource DefaultHeaderTemplate}" />
                <ContentControl x:Name="Body" 
                   ContentTemplate="{StaticResource DefaultBodyTemplate}" />
            </StackPanel>
        </ControlTemplate>
   </Setter.Value>

ありがとう!


アップデート

実際には、次のコードも機能しないため、StaticResourcesに関する私の仮定は間違っている可能性があります。

<ContentControl x:Name="Header">
<ContentControl.ContentTemplate>
    <DataTemplate x:Key="DefaultHeaderTemplate">
        <StackPanel>
            <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
        </StackPanel>
    </DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
4

3 に答える 3

3

私は自分の質問に答えるのが嫌いですが、うまくいきました。それは本当に他の場所の問題によるものでした。今後の参考のために、次のコードが機能します。

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel x:Name="LayoutRoot">
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                            <TextBlock FontSize="50" Text="{Binding Path=HeaderText}" />
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" Content="{Binding}" ContentTemplate="{StaticResource DefaultHeaderTemplate}" />

            </StackPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Content="{Binding}" の追加に注意してください。これは重要でした。:)

于 2009-07-07T18:28:15.650 に答える
1

ページのデータコンテキストをどこかに設定する必要があります。背後のコードで行うことができます

/// ctor
public MyClass()
{
   this.DataContext = ObjectThatIsDataContext;
}

またはXAMLの場合:

<UserControl ...>
    <UserControl.Resources>
       <myNS:MyClass x:Name="TheContext" x:Key="TheContext" />    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
        <TextBlock Text="{Binding Path=Field1}" />
    </Grid>
</UserControl>

この投稿も参照してください

于 2009-07-07T12:17:07.307 に答える
1

これは私のもの(3ベータ版)で動作します:

        <ContentControl x:Name="Header">
            <ContentControl.ContentTemplate>
                <DataTemplate >
                    <StackPanel>
                        <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
                    </StackPanel>
                </DataTemplate>
            </ContentControl.ContentTemplate>
            <ContentPresenter />
        </ContentControl>

ただし、なぜ機能するのかわかりません...テンプレートをプレゼンターの周りに置くことができるからだと思いましたが、もう少し遊んで、コンテンツプレゼンターをラップするものはすべて完全に無視されることに気付きました。

于 2009-07-07T13:18:47.893 に答える