2015-08-05 1 views
2

J'ai créé un app.In WPF que j'ai datatemplate comme suitComment ajouter un bouton à l'extérieur DataTemplate dans ItemsControl

<DataTemplate x:Key="ItemTemplate"> 
    <StackPanel> 
     <TextBlock Text="item"/> 
     <TextBlock Text="{Binding Number}"/> 
    </StackPanel> 
</DataTemplate> 

J'ai un ItemsControl comme celui-ci

<ItemsControl ItemsSource="{Binding Items}" 
         Grid.Column="1" 
         Grid.Row="3" 
         ItemTemplate="{StaticResource ItemTemplateWithButton}" /> 

où j'ai besoin un itemtemplate comme ceci

<DataTemplate x:Key="ItemTemplateWithButton"> 
     <StackPanel> 
      <StackPanel> 
       <TextBlock Text="item"/> 
       <TextBlock Text="{Binding Number}"/> 
      </StackPanel> 
      <StackPanel> 
       <Button> 
        <StackPanel> 
         <TextBlock Text="item"/> 
         <TextBlock Text="{Binding Number}"/> 
        </StackPanel> 
       </Button> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 

Y at-il une possibilité de réutiliser le datatemplate dans le nouvel ite mscontrol?

+0

Vous voulez utiliser un DataTemplate dans un autre DataTemplate? –

+0

Pour autant que je sache, vous ne pouvez pas réutiliser le modèle, vous devrez coller votre code. –

+0

@Glen a édité la question –

Répondre

2

Vous pouvez utiliser ContentControl trop

<DataTemplate x:Key="ItemTemplate"> 
    <StackPanel> 
     <TextBlock Text="item"/> 
     <TextBlock Text="{Binding Number}"/> 
    </StackPanel> 
</DataTemplate> 
<DataTemplate x:Key="ItemTemplateWithButton"> 
    <StackPanel> 
     <ContentControl ContentTemplate="{StaticResource ItemTemplate}" /> 
     <Button> 
      <ContentControl ContentTemplate="{StaticResource ItemTemplate}" /> 
     </Button> 
    </StackPanel> 
</DataTemplate> 
+1

@Bahman_Aries. C'est bizarre. Ça devrait marcher. Avez-vous essayé de lier la propriété de contenu?'Content =" {Binding} "' – Liero

+0

@Liero: Mon erreur, vous avez raison, ajouter 'Content =" {Binding} "' dans 'ContentControls' est la clé pour que cette solution fonctionne. –

0

Vous pouvez créer un UserControl pour maintenir le XAML que vous souhaitez réutiliser:

<UserControl x:Class="StackOverflow.SharedControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <StackPanel> 
      <TextBlock Text="item"> 
      </TextBlock> 
      <TextBlock Text="{Binding Number}"></TextBlock> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Ensuite, utilisez ce UserControl dans les deux modèles.

<DataTemplate x:Key="ItemTemplate"> 
    <controls:SharedControl/> 
</DataTemplate> 

<DataTemplate x:Key="ItemTemplateWithButton"> 
    <StackPanel> 
     <controls:SharedControl/> 
     <StackPanel> 
      <Button> 
       <StackPanel> 
        <TextBlock Text="item"> 
        </TextBlock> 
        <TextBlock Text="{Binding Number}"></TextBlock> 
       </StackPanel> 
      </Button> 
     </StackPanel> 
    </StackPanel> 
</DataTemplate> 
+1

Pourquoi créer usercontrol quand vous pouvez instancier le datatemplate dans ContentPresenter? – Liero

+0

Je pense qu'il est un peu trop fort de dire "vous ** devez ** créer un UserControl". – Rhys

+0

D'accord. Je l'ai changé. –

1

Ce que je comprends en lisant this answer et ce Liero mentionné dans les commentaires est il est possible de réutiliser un DataTemplate en utilisant soit ContentPresenter ou ContentControl. Cependant:

  1. est plus léger.
  2. ContentPresenter est conçu pour être utilisé à l'intérieur des modèles de contrôle.
  3. ContnetPresenter est conçu pour être utilisé tel quel tandis que ContentControl est conçu pour être étendu (hérité de).

En conséquence, voici une solution basée sur ce que vous avez demandé:

<DataTemplate x:Key="ItemTemplate"> 
     <StackPanel> 
      <TextBlock Text="item"/> 
      <TextBlock Text="{Binding Number}"/> 
     </StackPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="ItemTemplateWithButton"> 
     <StackPanel> 
      <ContentPresenter ContentTemplate="{StaticResource ItemTemplate}"/> 
      <StackPanel> 
       <Button Content="{Binding}" ContentTemplate="{StaticResource ItemTemplate}" /> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
+1

Qu'en est-il de: '

+0

@Liero: 'Content' est le' ContentPresenter' du 'Button'. Donc, votre code est fondamentalement le même que le mien, et cela fonctionnera bien. ps, ils ne sont pas redondants, cette structure est ce que l'OP a demandé. –

+0

Le résultat est le même, mais vous avez maintenant ContentPresenter dans ContentPresenter, puisque Button contient ContentPresenter dans son modèle. C'est comme ajouter ContentPresenter à ContentControl, car Button est ContentControl. – Liero