2010-04-01 3 views
9

Provare a mostrare un'etichetta solo quando viene selezionato un determinato elemento in una combinazione. Il codice dovrebbe quasi spiegarlo.WPF Visibilità di un elemento dell'interfaccia utente in base alla selezione combinata

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

risposta

24

Ci sono due problemi qui. Innanzitutto, la visibilità predefinita deve essere specificata nello stile. Ma anche con quello non funzionerà perché l'associazione sul trigger sta confrontando un valore Selected, un oggetto ComboBoxItem con un oggetto stringa e che non sarà mai equivalente. Per mantenere l'esempio semplice, ho inserito valori appropriati nelle proprietà Tag di ComboBoxItem. Sebbene l'effettiva implementazione del confronto varierà probabilmente in base alle esigenze specifiche dell'app.

<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: c'è un modo per riutilizzare questo trigger su più controlli senza ripeterlo? Ho più controlli che voglio nascondere/in base a questa selezione. Sono celle di griglia separate, quindi non posso nascondere un intero pannello di stack. – tim

+0

Se intendi tra più tipi di controllo (etichetta, pulsante, ecc.) Lo farei con un comportamento allegato. Se intendevi riutilizzare tra diverse istanze dello stesso tipo di controllo, dovresti rendere lo stile una risorsa. –

+0

Comportamento allegato. Grazie Scott, sei fantastico. – tim

9

Una soluzione "pulita" sarebbe

<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

Impossibile trovare la proprietà IsSelected di combobox in WPF. –

+0

È una proprietà su ComboBoxItem @ShantanuGupta – edvaldig