2011-01-12 4 views
2

Ich habe zwei Datenvorlagen verwendet, von denen einer die Teilmenge der anderen ist unten wie:eine Datenvorlage in einer anderen Datenvorlage in WPF

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:igEditors="http://infragistics.com/Editors" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:controls="clr-namespace:Client.UI.WPF;assembly=Client.UI.WPF" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2006" 
> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/Client.Resources.WPF.Styles;Component/Styles/CommonStyles.xaml"/> 
</ResourceDictionary.MergedDictionaries> 
<DataTemplate x:Key="XYZDataTemplate"> 
    <Grid x:Name="_rootGrid" DataContext="{Binding DataContext}" HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
        <controls:ValueDisplay Grid.Row="0" Grid.Column="0" LabelText="Build number" x:Name="buildNumber" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
            Margin="5,10,0,0"> 
      <igEditors:XamTextEditor /> 
     </controls:ValueDisplay> 
     <controls:ValueDisplay Grid.Row="0" Grid.Column="1" LabelText="Tool version" x:Name="toolVersion" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
            Margin="20,10,0,0"> 
      <igEditors:XamTextEditor IsReadOnly="True"/> 
     </controls:ValueDisplay> 
       </Grid> 

</DataTemplate> 

und das andere ist wie folgt:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:igEditors="http://infragistics.com/Editors" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:controls="clr-namespace:BHI.ULSS.Client.UI.WPF;assembly=ULSS.Client.UI.WPF" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2006" 
> 


<DataTemplate x:Key="ABCDataTemplate" > 
    <Grid x:Name="_rootGrid" DataContext="{Binding DataContext}" HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 

     <controls:ValueDisplay Grid.Row="0" Grid.Column="0" LabelText="Build number" x:Name="buildNumber" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
            Margin="5,10,0,0"> 
      <igEditors:XamTextEditor /> 
     </controls:ValueDisplay> 
     <controls:ValueDisplay Grid.Row="0" Grid.Column="1" LabelText="Tool version" x:Name="toolVersion" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
            Margin="20,10,0,0"> 
      <igEditors:XamTextEditor IsReadOnly="True"/> 
     </controls:ValueDisplay> 
     <controls:ValueDisplay Grid.Row="0" Grid.Column="2" LabelText="Size" ShowUnit="True" x:Name="size" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
            Margin="20,10,0,0"> 
      <igEditors:XamTextEditor/> 
     </controls:ValueDisplay> 
       </Grid> 

</DataTemplate> 

XYZDataTemplate ist eine Teilmenge des ABCDataTemplate als die ersten beiden Felder in beiden th Die Datenschablonen sind üblich, weshalb ich mich gefragt habe, ob es möglich ist, den redundanten Code in der ABCDataTemplate durch den von XYZDataTemplate für die Wartbarkeit des Codes zu ersetzen? Könnte jemand bitte vorschlagen, ob dies ein richtiger Ansatz wäre, wenn ja, wie kann ich das erreichen?

Vielen Dank im Voraus, Sowmya

Antwort

3

Wenn Sie einige Text in XAML haben, können Sie ContenPresenter als eine Art von „Makro“ erweitern Sie Ihren Textvorschlag an mehreren Stellen verwenden können. Zuerst definieren Sie eine DataTemplate und dann verwenden Sie die ContentPresenter mit dem Ressourcenschlüssel, um das Makro zu "erweitern". Hier ein Beispiel:

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="boilerplate"> 
      <StackPanel Orientation="Horizontal"> 
       <Rectangle Width="100" Height="100" Stroke="Black" Fill="{Binding}"/> 
       <Rectangle Width="100" Height="100" Stroke="Black" Fill="{Binding}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Grid.Resources> 
    <StackPanel> 
     <ContentPresenter ContentTemplate="{StaticResource boilerplate}" Content="Red"/> 
     <ContentPresenter ContentTemplate="{StaticResource boilerplate}" Content="Blue"/> 
    </StackPanel> 
</Grid> 

Da die Vorlage eine echte Vorlage ist, können Sie die Datenbindung verwenden. Stellen Sie es sich als ItemsControl mit nur einem Element vor. Wenn es keine Bindung gibt, können Sie die Eigenschaft Content weglassen. Sie können es sich als den Makro "Parameter" vorstellen.

Wenn Sie dies zu viel verwenden, wird Ihr XAML schwerer lesbar und die Kosten sind mäßig, also verwenden Sie es vorsichtig. Schließlich gibt es einige Einschränkungen darin, dass der "Makro" immer zu einem Element der obersten Ebene erweitert wird, so dass Sie nicht zwei Elemente zu einem einzigen Panel mit einer einzigen Verwendung von ContentPresenter hinzufügen können.

+0

danke Rick für Ihre Eingaben ... das hat mir geholfen, Datenvorlagen wieder zu verwenden :)! – Sowmya

0

Mit VS2010 würde ich eine UserControl verwenden.

UserControl s erben automatisch die DataContext Eigenschaft von ihren Eltern + haben Entwurfszeitunterstützung + u müssen Quellpfadwege nicht hart codieren.

Verwandte Themen