2009-07-06 10 views
3

私はSilverlightコントロールを構築していますが、HeaderおよびBody ContentControlのバインドを、それぞれのDataTemplatesを使用して設定しようとしています。理由は分かりませんが、これはうまくいきません(静かに失敗します)。私の唯一の推測は、DataTemplatesがStaticResourcesであるためです。誰でもアドバイスを提供できますか?DataTemplateからのバインディング?

<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> 
+0

コントロールのDataContextはどこかに設定されていますか?バインドするデータに「HeaderText」および「BodyText」プロパティがありますか? –

+0

はい、私はこれが本当であると確信しています。私はContentControlをに置き換えることができます。 –

答えて

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> 

= "{バインディング}" 追加をコンテンツに注意してください。これは重要でした。 :)

+0

'Binding'内の' Path'は余分なものではありませんか? –

+0

素敵な、..私が行方不明だっただけ。 +1 – Stimul8d

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> 

も参照してくださいthis post

+0

上記のコメントで述べたように、私は既にDataContextを設定しています。 –

1

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

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

しかし、なぜそれが動作するのかわかりません...私はあなたがあなたのテンプレートを発表者の周りに置くことができたと思ったが、 nはもう少し演奏され、あなたがcontentpresenterを包むものが完全に無視されることに気付きました。

関連する問題