2009-01-05 9 views
14

J'essaie de faire quelque chose de très simple. J'ai une propriété ToggleButton.IsChecked liée à un booléen. Je veux que l'arrière-plan bascule entre le rouge (faux) et le vert (vrai). Mais pour une raison quelconque, il semble être basculer entre le rouge et aucun fond. J'ai utilisé un convertisseur pour vérifier si je reçois des notifications appropriées de la source et je suis, donc je ne sais pas pourquoi un déclencheur (faux/rouge) fonctionne et l'autre (vrai/vert) ne fonctionne pas. J'aimerais également savoir comment les gens déboguent ce genre de problèmes. Merci!WPF Débogage des Datatriggers?

Voici le code.

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

Mise à jour: J'ai changé le togglebutton à une case à cocher et il fonctionne. Aucune idée pourquoi ...

Répondre

1

Cela me semble ok, pouvez-vous essayer de modifier le convertisseur pour retourner "rouge" ou "vert" plutôt que True/False (et modifier le déclencheur en conséquence). J'ai vu un certain comportement wierd avec des déclencheurs WPF lors de l'utilisation de NULL ou Booleans en ce qu'il "désactive" la propriété si elle est l'opposé de votre valeur de déclenchement, plutôt que d'utiliser une autre valeur de déclenchement.

En ce qui concerne les débogage .. J'aimerais savoir s'il y a une meilleure façon que les méthodes de hack et d'espoir que j'utilise en général pour le débogage XAML: D

+0

Merci pour la suggestion. Je l'ai essayé mais pas de chance. Je ne comprends pas pourquoi un déclencheur semble tirer et pas l'autre. – Sharun

+0

Essayez de placer votre convertisseur à l'intérieur du datatrigger lui-même et de lui renvoyer un booléen direct, plutôt que le nul qui renvoie les retours ischecked. –

+0

Assurez-vous également que IsThreeState est false. –

7

Essayez d'utiliser WPF Inspecteur:

https://wpfinspector.codeplex.com/

Une fois que vous vous connectez à votre application WPF en cours d'exécution, mettez en surbrillance l'élément en question en maintenant ctrl enfoncé et en cliquant dessus. Ensuite, sélectionnez l'élément dans l'arborescence visuelle (peut être un parent) qui contient le déclencheur. Cliquez sur l'onglet triggers et vous pouvez voir l'évaluation en cours (par exemple True == True). Si la condition du Datatrigger est remplie, la petite icône sera orange (allumée).

+0

J'ai essayé de l'utiliser mais mon application n'apparaissait pas dans la liste des applications WPF. Avez-vous des conseils pour contourner ce problème? – clcto

+1

Consultez la [source] (http://wpfinspector.codeplex.com/SourceControl/latest#trunk/source/Inspector/Services/ManagedApplicationsService.cs). Il semble qu'une application soit ajoutée à la liste si 'GetIsManagedApplication' renvoie true et que le nom du processus ne contient pas" devenv "," PresentationHost "ou" inspector ". Peut-être que le nom de votre projet contient une de ces chaînes? Sinon, examinez le code qui détermine si une application est gérée. – Pakman

+0

Yep, il contient "Inspector" ... qui semble être une manière assez hacky pour éviter d'énumérer sa propre application, mais je suppose que je pourrais modifier la source. Pour l'instant, je viens d'utiliser @DanLampings réponse. – clcto