2011-01-12 76 views
2

我有兩個數據模板,其中之一是像的另一子集如下:使用一個數據模板在另一個數據模板中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> 

,另一個是象下面這樣:

<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是ABCDataTemplate的一個子集作爲在兩個個前兩個字段e數據模板很常見,所以我想知道是否可以用ABCDataTemplate中的冗餘代碼替換XYZDataTemplate中的代碼以維護代碼?任何人都可以請建議,如果這是一個正確的方法,如果是的話,我怎麼能實現這一目標?

由於提前, Sowmya

回答

3

如果您在XAML一些樣板,您可以使用ContenPresenter作爲一種「宏」來擴大你的樣板在多個地方。首先定義一個DataTemplate,然後使用ContentPresenter和資源關鍵字「擴展」該宏。這裏是一個例子:

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

由於模板是一個真正的模板,你可以使用數據綁定。把它看作只有一個項目的ItemsControl。如果沒有綁定,則可以省略Content屬性。你可以把它看作宏的「參數」。

過度使用這將使您的XAML難以閱讀,並且性能成本適中,因此請謹慎使用它。最後,「宏」總是會擴展到一個頂級元素,所以一次只能使用一個ContentPresenter就不能將兩個元素添加到一個Panel

+0

非常感謝Rick爲您提供的信息......這有助於我理解重複使用數據模板:)! – Sowmya 2011-01-12 06:26:59

0

使用VS2010,我會考慮使用UserControl

UserControl s自動從父母身上繼承DataContext屬性+有設計時支持+你不必硬編碼資源路徑。

相關問題