2009-07-06 9 views
3

Je suis en train de créer un contrôle Silverlight et j'essaie de configurer des liaisons pour les ContentControls d'en-tête et de corps via leurs DataTemplates respectifs. Je ne sais pas pourquoi, mais cela ne fonctionne pas (échoue silencieusement). Ma seule supposition est que c'est parce que les DataTemplates sont des StaticResources. Quelqu'un peut-il offrir des conseils? Le contrôle a le modèle par défaut suivant:Liaison depuis un 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> 

Merci!


Mise à jour

En fait, le code suivant ne fonctionne pas non plus, donc mon hypothèse sur les StaticResources peut-être tort.

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

Le DataContext du contrôle est défini quelque part. Les données que vous liez ont-elles la propriété "HeaderText" et "BodyText"? –

+0

Oui, je suis assez certain que c'est vrai. Pour preuve, je peux remplacer ContentControl par et cela fonctionne. –

Répondre

3

Je déteste répondre à ma propre question, mais je l'ai fonctionné. C'était vraiment dû à un problème ailleurs. Pour référence ultérieure, le code suivant fonctionne pour moi:

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

S'il vous plaît noter le contenu = "{} Reliure" addition. C'était important. :)

+0

Le 'Path' n'est-il pas inclus dans' Binding'? –

+0

Lovely, .. juste ce qui me manquait. +1 – Stimul8d

1

Vous devez définir le contexte de données de la page quelque part. peut être fait dans le code derrière

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

ou 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> 

Voir aussi this post

+0

Comme mentionné dans les commentaires ci-dessus, je définis déjà le DataContext. –

1

Cela fonctionne sur le mien (3 Beta):

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

Cependant, Je ne sais pas pourquoi ça marche ... Je pensais que c'était parce que tu pouvais mettre ton gabarit autour du présentateur, mais le n joué un peu plus et réalisé que tout ce que vous enveloppez le contentpresenter est simplement complètement ignoré.

Questions connexes