2010-12-05 18 views
3

J'ai créé deux ressources d'image et je veux les référencer de manière dynamique depuis le HierarchicalDataTemplate d'un contrôle TreeView.Comment puis-je faire référence à des ressources statiques dans WPF lors de l'exécution?

Ceci est mon code XAML:

<TreeView Margin="17,22" Name="TreeView"> 
       <TreeView.Resources> 
        <BitmapImage x:Key="Icon1" UriSource="pack://application:,,,/icon1.ico"/> 
        <BitmapImage x:Key="Icon2" UriSource="pack://application:,,,/icon2.ico"/> 
       </TreeView.Resources> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Image Source="{StaticResource Icon1}" Margin="0,0,5,0" Width="16" Height="16"/> 
          <TextBlock Text="{Binding Name}" Margin="0,2,0,0" FontWeight="Normal" FontSize="11"/> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate> 
      </TreeView> 

Quelle est la syntaxe correcte pour la liaison Source de l'image afin que je puisse sélectionner au moment de l'exécution quelle image statique est affiché?

Répondre

2

Vous êtes déjà lié à certaines propriétés Name. Étendez votre modèle (view-) avec une propriété entière Icon qui détermine avec l'icône que vous souhaitez afficher pour cette entrée. Ensuite, vous pouvez utiliser un déclencheur:

<Image Margin="0,0,5,0" Width="16" Height="16"> 
    <Image.Style> 
     <Style TargetType="{x:Type Image}"> 
      <Setter Property="Source" Value="{StaticResource Icon1}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Icon}" Value="2"> 
        <Setter Property="Source" Value="{StaticResource Icon2}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

Merci, c'est exactement ce que je cherchais. – Chris

+0

Bien que je me demande s'il existe un moyen de spécifier le nom de la ressource statique directement à partir d'une propriété sans avoir recours à un déclencheur? – Chris

+0

@Chris: Je ne pense pas que ce soit possible: les liaisons ne peuvent être effectuées que sur DependencyProperties, et StaticResourceExtension.ResourceKey n'est pas un DependencyProperty. Cependant, vous pouvez vous lier directement à BitmapImage, si vous le souhaitez: ''. Ensuite, 'MyImage' dans votre modèle de données doit contenir le' BitmapImage' à afficher. – Heinzi

0

Voulez-vous dire le code-behind? Dans le code-behind, vous pouvez dire

BitmapImage b = (BitmapImage)TreeView.FindResource("Icon1"); 

puis de l'affecter à la propriété dont vous avez besoin.