DataTemplate 包含另一个 DataTemplate

pap*_*zzo 0 .net wpf datatemplate itemtemplateselector

见下文,所有 DataTemplates 都具有相同的前两个 TextBlock。
在 fieldStringTemplate 和 fieldDateTemplate 中,我想引用 fieldTemplate 所以我不重复这两个。
如何从 DataTemplate 引用 DataTemplate?

真正的应用程序有更多的模板和更多的常见元素。
在实际应用中,这些是实现 Field 的类。
FieldTemplateSelector 基于类。

<Window.Resources>
    <local:FieldTemplateSelector x:Key="fieldTemplateSelector"/>
    <DataTemplate x:Key="fieldTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Path=Name}" />
            <TextBlock Text="{Binding Path=DisplayValue}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="fieldStringTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Path=Name}" />
            <TextBlock Text="{Binding Path=DisplayValue}" />
            <TextBox Text="{Binding Path=FieldValue}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="fieldDateTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Path=Name}" />
            <TextBlock Text="{Binding Path=DisplayValue}" />
            <DatePicker SelectedDate="{Binding Path=FieldValue}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox ItemsSource="{Binding Path=Fields}"
             ItemTemplateSelector="{StaticResource fieldTemplateSelector}"
             HorizontalContentAlignment="Stretch">
    </ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)

Fed*_*gui 5

在我看来,做这样的事情会好得多:

<DataTemplate x:Key="fieldStringTemplate">
   <TextBox Text="{Binding Path=FieldValue}" />
</DataTemplate>

<DataTemplate x:Key="fieldDateTemplate">
    <DatePicker SelectedDate="{Binding Path=FieldValue}" />
</DataTemplate>

<!-- and so on... -->

<DataTemplate x:Key="common">
   <StackPanel>
       <TextBlock Text="{Binding Path=Name}" />
       <TextBlock Text="{Binding Path=DisplayValue}" />
       <ContentPresenter Content="{Binding}" 
                         ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>
   </StackPanel>
</DataTemplate>

<ListBox ItemsSource="{Binding Path=Fields}"
         ItemTemplate="{StaticResource common}"
         HorizontalContentAlignment="Stretch">
</ListBox>
Run Code Online (Sandbox Code Playgroud)