2009-09-19 8 views
2

J'ai un peu de xaml collé à la fin de cette question. C'est à partir d'un fichier de ressources dans mon projet.Refrappage XAML - Comment extraire le balisage commun

HierarchicalDataTemplate et DataTemplate partagent exactement la même structure. Existe-t-il un moyen d'extraire les parties communes et de les référencer?

<HierarchicalDataTemplate DataType="{x:Type local:ChapterViewModel}" 
          x:Key="ChapterOutcomesTemplate" 
          ItemsSource="{Binding Path=Chapter.Outcomes}" 
          ItemTemplate="{StaticResource AssignedOutcomeTemplate}"> 
    <StackPanel Orientation="Horizontal"> 
     <Image Height="16" 
      Width="16" 
      Margin="0,0,0,0" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Source="{Binding Source={x:Static images:DocumentImages.Outcomes}}" 
      Visibility="{Binding IsOutcomesAssigned, Converter={StaticResource BooleanToVisibility}, Mode=OneWay}" 
        /> 
     <Image Height="16" 
      Width="16" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Margin="5,0,0,0" 
      Source="{Binding Source={x:Static images:DocumentImages.Chapter}}" 
        /> 
     <TextBlock Text="{Binding Chapter.Name}" 
      Margin="5,0,0,0" /> 
    </StackPanel> 
</HierarchicalDataTemplate> 
<DataTemplate x:Key="ItemTemplate"> 
    <StackPanel Orientation="Horizontal"> 
     <Image Height="16" 
      Width="16" 
      Margin="0,0,0,0" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Source="{Binding Source={x:Static images:DocumentImages.Outcomes}}" 
      Visibility="{Binding IsOutcomesAssigned, Converter={StaticResource BooleanToVisibility}, Mode=OneWay}" /> 
     <Image Height="16" 
      Width="16" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Margin="5,0,0,0" 
      Source="{Binding Source={x:Static images:DocumentImages.Chapter}}" /> 
     <TextBlock Text="{Binding Chapter.Name}" 
      Margin="5,0,0,0" /> 
    </StackPanel> 

</DataTemplate> 

Répondre

3

Oui, vous pouvez. Définissez le contenu qui doit être partagé en tant que modèle de contrôle, puis utilisez-le dans les deux modèles:

<!-- New control template --> 
<ControlTemplate x:Key="ChapterAndItemTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <Image Height="16" Width="16" Margin="0" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Source="{Binding Source={x:Static images:DocumentImages.Outcomes}}" 
      Visibility="{Binding IsOutcomesAssigned, Converter={StaticResource BooleanToVisibility}, Mode=OneWay}" /> 
    <Image Height="16" Width="16" Margin="5,0,0,0" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Source="{Binding Source={x:Static images:DocumentImages.Chapter}}" /> 
    <TextBlock Text="{Binding Chapter.Name}" Margin="5,0,0,0" /> 
    </StackPanel> 
</ControlTemplate> 

<HierarchicalDataTemplate DataType="{x:Type local:ChapterViewModel}" 
          x:Key="ChapterOutcomesTemplate" 
          ItemsSource="{Binding Path=Chapter.Outcomes}" 
          ItemTemplate="{StaticResource AssignedOutcomeTemplate}"> 
    <!-- Used here... --> 
    <Control Template="{StaticResource ChapterAndItemTemplate}" /> 
</HierarchicalDataTemplate> 

<DataTemplate x:Key="ItemTemplate"> 
    <!-- ...and here --> 
    <Control Template="{StaticResource ChapterAndItemTemplate}" /> 
</DataTemplate> 
+0

Hi Drew. Connaissez-vous des outils qui aident à faire des refactorings comme celui-ci? Semblable à comment resharper pourrait le faire dans le code .. Cheers – Berryl

+0

@Berryl - Je n'ai pas encore vu d'outils pour cela, mais je suis sûr qu'ils vont bientôt surface. Peut-être un projet amusant pour quelqu'un qui veut essayer l'API du plugin ReSharper. –

+0

@DrewNoakes Je suppose qu'il ne sera pas sage de continuer à attendre :-) – itsho

Questions connexes