2011-08-19 10 views
10

Este comportamiento me parece increíblemente extraño, y supongo que estoy haciendo algo mal para obtenerlo. Tengo un ContentControl que usa un DataTemplete para representar un TabControl. Quiero que se muestre una imagen cuando no hay pestañas abiertas, y ocultarlas cuando las haya. Pero aquí está el problema:WPF Trigger no establecerá propiedad si está configurado en Elemento

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png"> 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
         Value="0"> 
          <Setter Property="Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 

Esto no funciona ... más o menos.

He probado esto en Visiblity y Margen (solo para estar seguro). Este disparador alterará la propiedad, a menos que esa propiedad esté definida en las etiquetas Image. Si es así, el disparador no actualizará esa propiedad. Entonces, si no defino una visibilidad para la imagen, y el disparador la oculta, funciona. El problema es que el valor predeterminado es Visible y el desencadenador debe mostrarlo cuando value = 0 y ocultarlo de lo contrario.

¿Por qué el activador no anula las propiedades que están explícitamente definidas? ¿No es ese su propósito?

+0

¿Has intentado configurarlo para el otro lado? Como en, cuando Value! = "0" establece la visibilidad a no visible? – mydogisbox

+0

¿Se puede usar incluso! = En un valor de activación? – Tyrsius

+0

No directamente, pero con un poco de esfuerzo se puede hacer. @CodeNaked tiene una mejor solución. Aquí está la solución indeseable. http://blogs.msdn.com/b/mikehillberg/archive/2008/09/30/comparabledatatrigger.aspx – mydogisbox

Respuesta

18

Esta es la normal Dependency Property Value Precedence. Al configurarlo en la imagen está en el n. ° 3, mientras que en el disparador de estilo está en una precedencia inferior al n. ° 6.

Usted puede hacer esto en su lugar:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
        Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

+1 Siempre me pregunté por qué a veces necesitaba configurar el Setter en el Estilo y el Trigger para el Trigger. para trabajar – Rachel

+0

Esto no se aplica al valor predeterminado o a un valor heredado de los metadatos. Vea mi respuesta de por qué debe establecer el valor en el colocador además de configurarlo con el desencadenador. – mydogisbox

+0

@mydogisbox - No estoy seguro de lo que quieres decir. Si el Disparador configura la Visibilidad en Oculto y no hay un Organizador adicional fuera del activador, cuando el activador ya no se aplica, lo restauraría al valor predeterminado (que es Visible). – CodeNaked

6

configurar la visibilidad en el estilo, además de en el gatillo

que he encontrado este comportamiento extraño con DataTriggers muchas veces, donde a veces DataTrigger Setter ganaron no tendrá efecto a menos que Setter también esté definido en el Estilo.

no funcionará

<Image Visibility="Collapsed"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

Trabajará

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

Editar: Ver the accepted answer para una explicación sobre por qué esto no funciona. Tiene que ver con el orden en que se determinan las propiedades de dependencia, donde las propiedades definidas en el <Tag> siempre tienen prioridad sobre los valores desencadenados.

0

Cuando un activador es verdadero, cambia el valor al valor deseado. Cuando ya no es verdadero, devuelve el valor al valor anterior. No lo cambiará a un valor que no será.

Esto significa que si el valor original es visible y lo cambia a visible, cuando el activador ya no esté activo, el valor volverá a ser visible.

+0

El valor original en su muestra no es Visible, es Oculto. – CodeNaked

+0

Sí, pero debe leer el resto de sus comentarios sobre el tema. Lo probó con la propiedad establecida en la imagen misma (no se puede cambiar con el desencadenador de datos), probó otros controles con el valor predeterminado de no visible (funciona) y probó con el activador del activador en lugar de mostrar (funciona). Como el valor predeterminado es visible, la única forma en que funcionará un desencadenador de datos es el último caso, de lo contrario, se mostrará de manera predeterminada como visible y el desencadenador no hará nada. – mydogisbox

Cuestiones relacionadas