2010-04-01 10 views
9

Intentando mostrar una etiqueta solo cuando se selecciona un elemento determinado en un combo. El código debería explicarlo bastante.WPF Visibilidad de un elemento de IU basado en la selección de combinación

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

Respuesta

24

Hay dos problemas aquí. Primero, la visibilidad predeterminada debe especificarse en el estilo. Pero incluso con eso no funcionará porque el enlace en el desencadenador está comparando un SelectedValue, un objeto ComboBoxItem con un objeto de cadena y eso nunca será equivalente. Para mantener el ejemplo simple, coloqué los valores adecuados en las propiedades de Etiqueta del ComboBoxItem. Aunque la implementación real de la comparación probablemente variará en función de las necesidades específicas de la aplicación.

<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

Por cierto: ¿hay una manera de reutilizar este disparador a través de múltiples controles sin repetirlo? Tengo varios controles que quiero ocultar/basados ​​en esta selección. Son celdas de cuadrícula separadas, así que no puedo esconder todo un panel de pila. – tim

+0

Si te refieres a varios tipos de control (Etiqueta, Botón, etc.) lo haría con un comportamiento adjunto. Si quería decir reutilizado entre diferentes instancias del mismo tipo de control, debe convertir el estilo en un recurso. –

+0

Comportamiento asociado. Gracias, Scott, eres increíble. – tim

9

una solución "más limpia" sería

<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

No pude encontrar la propiedad IsSelected de combobox en WPF. –

+0

Es una propiedad en un ComboBoxItem @ShantanuGupta – edvaldig

Cuestiones relacionadas