2010-04-01 7 views
9

Essaie d'afficher une étiquette uniquement lorsqu'un élément donné est sélectionné. Le code devrait plutôt l'expliquer.WPF Visibilité d'un élément d'interface utilisateur basé sur la sélection de combo

<ComboBox Name="comboMyCombo"> 
     <ComboBoxItem>Don't show the label</ComboBoxItem> 
     <ComboBoxItem>Show the label</ComboBoxItem> 
    </ComboBox> 

    <Label Visibility="Collapsed">This is my label 
     <Label.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger 
          Binding="{Binding ElementName=comboMyCombo, Path=SelectedValue}" Value="Show the label"> 
         <Setter Property="Label.Visibility" Value="Visible"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Label.Style> 
    </Label> 

Répondre

24

Il y a deux problèmes ici. D'abord, la visibilité par défaut doit être spécifiée dans le style. Mais même avec ça ça ne marchera pas car la liaison sur le trigger compare une SelectedValue, un objet ComboBoxItem avec un objet string et ça ne sera jamais équivalent. Pour garder l'exemple simple, j'ai placé les valeurs appropriées dans les propriétés de la balise ComboBoxItem. Bien que la mise en œuvre réelle de la comparaison varie probablement en fonction des besoins spécifiques de l'application.

<ComboBox Name="comboMyCombo"> 
     <ComboBoxItem Tag="Hide">Don't show the label</ComboBoxItem> 
     <ComboBoxItem Tag="Show">Show the label</ComboBoxItem> 
    </ComboBox> 

    <Label>This is my label 
     <Label.Style> 
      <Style> 
       <Setter Property="Label.Visibility" Value="Collapsed"></Setter> 
       <Style.Triggers> 
        <DataTrigger 
         Binding="{Binding ElementName=comboMyCombo, Path=SelectedItem.Tag}" Value="Show"> 
         <Setter Property="Label.Visibility" Value="Visible"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Label.Style> 
    </Label> 
+0

BTW: est-il possible de réutiliser ce déclencheur sur plusieurs contrôles sans le répéter? J'ai plusieurs contrôles que je veux cacher/en fonction de cette sélection. Ce sont des cellules de maillage séparées, donc je ne peux pas cacher tout un panneau de pile. – tim

+0

Si vous voulez dire à travers plusieurs types de contrôle (étiquette, bouton, etc.), je le ferais avec un comportement attaché. Si vous voulez réutiliser entre différentes instances du même type de contrôle, vous devez faire du style une ressource. –

+0

Comportement joint. Merci Scott, vous êtes génial. – tim

9

Une solution « propre » serait

<ComboBox> 
    <ComboBoxItem x:Name="iOne" Content="One"/> 
    <ComboBoxItem x:Name="iTwo" Content="Two"/> 
    <ComboBoxItem x:Name="iThree" Content="Three"/> 
</ComboBox> 

<Label Content="One is shown"> 
<Label.Style> 
    <Style TargetType="Label"> 
     <Setter Property="Visibility" Value="Hidden" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=iOne, Path=IsSelected}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Label.Style> 
</Label> 
+0

Impossible de trouver la propriété IsSelected de la zone de liste déroulante dans WPF. –

+0

C'est une propriété sur un ComboBoxItem @ShantanuGupta – edvaldig

Questions connexes