2009-01-05 12 views
14

Estoy tratando de hacer algo muy simple. Tengo una propiedad ToggleButton.IsChecked vinculada a un bool. Quiero que el fondo cambie entre rojo (falso) y verde (verdadero). Pero por alguna razón parece estar cambiando entre rojo y sin fondo. Utilicé un convertidor para comprobar si recibo las notificaciones adecuadas de la fuente y lo estoy, por lo que no estoy seguro de por qué funciona un disparador (falso/rojo) y el otro (verdadero/verde) no funciona. También me gustaría escuchar cómo la gente depura este tipo de problemas. ¡Gracias!WPF Debugging datatriggers?

Aquí está el código.

<DataTemplate x:Name"Flipper"> 
    <StackPanel> 
    ... 
    <ToggleButton IsChecked="{Binding Path=BoolValue, 
             Converter={StaticResource converter}}" 
        Name="onoff" > 
    </ToggleButton> 
    ... 
    <StackPanel> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding ElementName=onoff,Path=IsChecked}" 
        Value="True"> 
      <Setter TargetName="onoff" Property="Background" Value="Green"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding ElementName=onoff,Path=IsChecked}" 
        Value="False"> 
      <Setter TargetName="onoff" Property="Background" Value="Red"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

actualización: He cambiado la togglebutton a una casilla de verificación y funciona. No tengo idea de por qué ...

Respuesta

1

Me parece bien, puede intentar modificar el convertidor para que devuelva "rojo" o "verde" en lugar de Verdadero/Falso (y modifique el activador según corresponda). He visto un comportamiento extraño con los activadores de WPF cuando utilizo NULL o Booleans porque "desconecta" la propiedad si es lo opuesto a su valor de activación, en lugar de usar otro valor de activación.

En cuanto a la depuración de ellos .. Me gustaría saber si hay una manera mejor que los métodos de hackers y la esperanza general que utilizo para la depuración XAML: D

+0

Gracias por la sugerencia. Lo intenté pero no tuve suerte. No entiendo por qué un disparador parece estar disparando y no el otro. – Sharun

+0

Intenta poner tu convertidor dentro del datatrigger y devuelve un bool directo de él, en lugar del Nullable que se revisa. –

+0

También asegúrese de que IsThreeState sea falso. –

7

Trate de usar WPF Inspector:

https://wpfinspector.codeplex.com/

Una vez que se conecte a la aplicación WPF en ejecución, resalte el elemento en cuestión manteniendo presionado ctrl y haciendo clic en él. Luego, seleccione el elemento en el árbol visual (podría ser un elemento primario) que contiene el desencadenador. Haga clic en la pestaña de disparadores y podrá ver la evaluación actual (por ejemplo, True == True). Si se cumple la condición del disparador de datos, el pequeño icono será naranja (encendido).

+0

Intenté usar esto pero mi aplicación no apareció en la lista de aplicaciones de WPF. ¿Tienes algún consejo para evitar este problema? – clcto

+1

Consulte la [fuente] (http://wpfinspector.codeplex.com/SourceControl/latest#trunk/source/Inspector/Services/ManagedApplicationsService.cs). Parece que una aplicación se agrega a la lista si 'GetIsManagedApplication' devuelve verdadero y el nombre del proceso no contiene" devenv "," PresentationHost "o" inspector ". ¿Tal vez el nombre de su proyecto contiene una de esas cadenas? De lo contrario, busque en el código que determina si se administra una aplicación. – Pakman

+0

Sí, contiene "Inspector" ... que parece una forma bastante hacky de evitar incluir su propia aplicación, pero creo que podría modificar la fuente. Por ahora acabo de usar la respuesta @DanLampings. – clcto