2009-06-17 16 views
2

Est-il possible d'utiliser un MultiTrigger pour évaluer des propriétés sur plusieurs éléments? Cela ne réside pas dans un modèle, mais dans Usercontrol/Window.SourceName avec MultiTriggers

Exemple:

<CheckBox x:Name="checkBox1" /> 
<CheckBox x:Name="checkBox2" /> 

<CustomControl> 
    <CustomControl.ContentTemplate> 
       <DataTemplate> 
         <DataTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition 
             SourceName="checkBox1" 
             Property="IsChecked" 
             Value="False" /> 
            <Condition 
             SourceName="checkBox2" 
             Property="IsChecked" 
             Value="True" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.Setters> 
            <Setter 
             Property="Visibility" 
             Value="Collapsed" /> 
           </MultiTrigger.Setters> 
          </MultiTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
</CustomControl.ContentTemplate> 

Dans une Trigger normale, nous pouvons utiliser le sourceName pour déclencher contre les propriétés ou l'autre de ces contrôles de cases à cocher, mais avec un MultiTrigger-je obtenir des erreurs de quand il tente de trouver ces contrôles.

Note: La raison pour laquelle j'utilise un DataTemplate par opposition à un Style est mentionné here

Répondre

2

Vous pouvez en effet utiliser le nom de la source, mais votre DataTemplate ne semble pas être correctement défini. J'ai essayé de remplir votre exemple qui semble fonctionner:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Grid> 
     <Grid.Resources> 
      <DataTemplate DataType="{x:Type sys:String}"> 
       <StackPanel> 
        <TextBlock x:Name="textBlock" Text="{Binding}"></TextBlock> 
        <CheckBox x:Name="checkBox1" /> 
        <CheckBox x:Name="checkBox2" /> 
       </StackPanel> 
       <DataTemplate.Triggers> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition 
           SourceName="checkBox1" 
           Property="IsChecked" 
           Value="False" /> 
          <Condition 
           SourceName="checkBox2" 
           Property="IsChecked" 
           Value="True" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.Setters> 
          <Setter 
          TargetName="textBlock" 
           Property="Visibility" 
           Value="Collapsed" /> 
         </MultiTrigger.Setters> 
        </MultiTrigger> 
       </DataTemplate.Triggers> 

      </DataTemplate> 
     </Grid.Resources> 
     <ContentControl> 
      <sys:String>Foo</sys:String> 
     </ContentControl> 
    </Grid> 
</Page> 

Le problème semble être que vous ne définissez pas vos CheckBoxes à l'intérieur votre DataTemplate, qui est l'endroit où ils doivent être.

+0

Merci pour votre réponse, je comprends votre solution et cela fonctionne certainement dans ce scénario. La solution pour laquelle je tirais était celle qui ne nécessitait pas que ces contrôles résident dans le même modèle. Avec un seul déclencheur, je peux utiliser SourceName avec des contrôles qui ne résident pas dans un modèle. J'espérais un comportement similaire avec MultiTriggers. Je suppose que votre réponse est que ce n'est pas possible. –

+0

Je ne pense pas que ce soit possible puisque la portée de nom pour DataTemplate Triggers est le DataTemplate. Vous pouvez être en mesure d'écrire certains MultiDataTriggers, mais cela limiterait le DataType que vous utilisez et exigerait que vous fournissiez ces propriétés. – micahtan