2010-05-15 11 views
2

Est-il possible d'utiliser des modèles dans des modèles?Est-il possible de modéliser un modèle dans WPF XAML?

Par exemple, j'ai les deux modèles suivants:

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

Il y a une section de XAML identique:

<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}"/> 

Est-il possible de se déplacer que d'une ressource et consultez par son nom , plutôt que de le répéter?

Répondre

2

La réponse semble être « presque »

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

Ensuite, les modèles réduisent à

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

Cependant, notez que vous ne pouvez pas mettre SourceUpdated dans un style, car il n'est pas couvert par EventSetter