2011-01-12 74 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属性+有设计时支持+你不必硬编码资源路径。

相关问题