Is template template possible in WPF XAML?

Can templates be used in templates?

For example, I have the following two templates:

<HierarchicalDataTemplate 
    x:Key="RecursiveTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkGreen" Width="14" Height="14"/>
        <TextBlock 
            MouseDown="OnTreeMouseDown" 
            TargetUpdated="OnTargetUpdated"
            Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
            Margin="5" 
            Text="{Binding Name}"/>
        <TextBox 
            PreviewKeyDown="OnTreeKeyDown" 
            Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
            Margin="2" 
            Text="{Binding Name}"/>
    </StackPanel>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate 
    x:Key="ContainerTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkBlue" Width="14" Height="14"/>
        <TextBlock 
            MouseDown="OnTreeMouseDown" 
            TargetUpdated="OnTargetUpdated"
            Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
            Margin="5" 
            Text="{Binding Name}"/>
        <TextBox 
            PreviewKeyDown="OnTreeKeyDown" 
            Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
            Margin="2" 
            Text="{Binding Name}"/>
    </StackPanel>
</HierarchicalDataTemplate>

      

There is a section of identical XAML here:

<TextBlock 
     MouseDown="OnTreeMouseDown" 
     TargetUpdated="OnTargetUpdated"
     Visibility="{Binding Editing, Converter={StaticResource visibilityInverter}}" 
     Margin="5" 
     Text="{Binding Name}"/>
<TextBox 
     PreviewKeyDown="OnTreeKeyDown" 
     Visibility="{Binding Editing, Converter={StaticResource visibilityConverter}}" 
     Margin="2" 
     Text="{Binding Name}"/>

      

Is it possible to transfer this to a resource and refer to it by name rather than repeating it?

+2


a source to share


1 answer


The answer seems to be "almost"

<Style x:Key="textBlockStyle" TargetType="TextBlock">
   <Setter Property="Visibility" Value="{Binding Editing, Converter={StaticResource visibilityInverter}}"/>
   <Setter Property="Margin" Value="4"/>
   <Setter Property="Text" Value="{Binding Name}"/>
   <EventSetter Event="MouseDown" Handler="OnTreeMouseDown"/>
</Style>

<Style x:Key="textBoxStyle" TargetType="TextBox">
   <Setter Property="Visibility" Value="{Binding Editing, Converter={StaticResource visibilityConverter}}"/>
   <Setter Property="Margin" Value="1"/>
   <Setter Property="Text" Value="{Binding Name, NotifyOnSourceUpdated=True}"/>
   <EventSetter Event="PreviewKeyDown" Handler="OnTreeKeyDown"/>
</Style>

      

The templates then boil down to



<HierarchicalDataTemplate 
    x:Key="RecursiveTemplate"
    ItemsSource="{Binding Children}">
    <StackPanel Margin="1" Orientation="Horizontal">
        <Ellipse Fill="DarkGreen" Width="14" Height="14"/>
        <TextBlock 
            Style="{StaticResource textBlockStyle}"/>
        <TextBox 
            SourceUpdated="OnSourceUpdated"
            Style="{StaticResource textBoxStyle}"/>
    </StackPanel>
</HierarchicalDataTemplate>

      

However, please note that you cannot put SourceUpdated in the style as it does not propagate to the EventSetter

+2


a source







All Articles