2011-08-06 10 views
9

De la causa, podemos comprobar propiedad de cadena de algún tipo de control que ha estado vacío como el siguiente código:WPF: Condición de disparo cuando se vacía cadena

<Trigger SourceName="atCaption" Property="Text" Value="{x:Static sys:String.Empty}"> 
    <Setter TargetName="imgBack" Property="Margin" Value="0"/> 
    <Setter TargetName="atCaption" Property="Margin" Value="0"/> 
</Trigger> 

y luego, cadena de cómo se puede definir una condición que 'no está vacío' ?

<!--unfortunately, can't accept '!=' operator in xaml.--> 
<Trigger SourceName="atCaption" Property="Text" Value!="{x:Static sys:String.Empty}"> 
    <Setter TargetName="imgBack" Property="Margin" Value="0"/> 
    <Setter TargetName="atCaption" Property="Margin" Value="0"/> 
</Trigger> 

ayúdame.

+0

pregunta similar aquí: http://stackoverflow.com/questions/356194/wpf- datatrigger-where-value-is-not-null – LPL

Respuesta

5

El uso de un ValueConverter es una solución.

Al usar MVVM, podría considerar una propiedad adicional en la clase ViewModel a la que se está vinculando que determina cómo se debe mostrar un control.

Cuando utilizo el MVVM-forma de resolver este no necesito un disparador, simplemente añadir propiedades adicionales al modelo de vista y se unen las propiedades de la vista de estas propiedades adicionales para manipular la vista

+3

Lo único que quiero agregar al respecto es que con MVVM, la idea es que el modelo de vista no sepa cómo se muestra. En cambio, la vista debe tomar el modelo de vista y mostrarlo como lo considere apropiado. p.ej. tener una propiedad de color en su VM para decirle a la vista de qué color mostrar esta cosa no es bueno desde un punto de vista de MVVM puro. (Obviamente en el mundo real, los modelos de programación "pura" tienden a romperse un poco, solo pensé en señalarlo;)) – Steve

+1

@ user1080084 - Sí, pero tengo que decir que tampoco me gustan los ValueConverters: es código en el ver y tiene que ser aplicado por el diseñador. Estos convertidores se 'cuelgan' entre View y ViewModel. –

0

Si utiliza un desencadenante de datos, utiliza una sintaxis de enlace para que pueda usar una clase IValueConverter para convertir a propiedad en un valor booleano. Puede escribir el cheque que desea que tenga lugar en el código dentro de un IValueConverter personalizado.

4

Para obtener rápidamente alrededor con esto, los valores que se aplican a la condición inversa deben predeterminarse en la declaración del elemento o el Estilo y luego usar la condición de igualdad directa para alterar los valores.

p. Ej.

Suponga que si el margen 5 es lo que establece para la cadena vacía y 0 es lo que tiene que establecer para la cadena no vacía, establecerá 0 de forma predeterminada como un Setter simple en Style y luego comprobará cadena vacía usando Trigger y establecer 5. Asegúrese de que el Setter predeterminado (para 0) aparece antes de Trigger (para 5) en el Estilo.

4

para aumentar la respuesta por WPF-it (para mí esto es una solución permanente, no una solución rápida)

<DataTrigger Binding="{Binding VolumeGroup}" Value="{x:Null}"> 
     <Setter Property="Background" Value="{StaticResource DataGridBackground}" /> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding VolumeGroup}" Value=""> 
     <Setter Property="Background" Value="{StaticResource DataGridBackground}" /> 
    </DataTrigger> 
</Style.Triggers> 
<!--inverted rare case: VolumeGroup will usually be empty so cells will be {StaticResource DataGridBackground}--> 
<Setter Property="Background" Value="DarkOliveGreen" /> 
Cuestiones relacionadas