2009-01-05 10 views
14

Sto provando a fare qualcosa di molto semplice. Ho una proprietà ToggleButton.IsChecked legata a un bool. Voglio che lo sfondo cambi tra rosso (falso) e verde (vero). Ma per qualche motivo sembra passare da rosso a senza sfondo. Ho usato un convertitore per verificare se ricevo le notifiche appropriate dalla fonte e io lo sono, quindi non sono sicuro del motivo per cui un trigger (falso/rosso) funziona e l'altro (vero/verde) non funziona. Vorrebbe anche sentire come le persone eseguono il debug di questo tipo di problemi. Grazie!WPF Debug dei datatrigger?

Ecco il codice.

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

Aggiornamento: ho cambiato il ToggleButton ad una casella di controllo e funziona. Non ho idea del perché ...

risposta

1

Mi sembra ok, puoi provare a modificare il convertitore in modo che restituisca "rosso" o "verde" anziché True/False (e modifica il trigger di conseguenza). Ho visto un comportamento strano con i trigger WPF quando si utilizza NULL o Booleans in quanto "disattiva" la proprietà se è l'opposto del valore di trigger, anziché utilizzare un altro valore di trigger.

quanto per loro il debug .. Mi piacerebbe sapere se c'è un modo migliore rispetto ai metodi Hack e speranza io in genere uso per il debugging XAML: D

+0

Grazie per il suggerimento. L'ho provato ma senza fortuna. Non capisco perché un grilletto sembra sparare e non l'altro. – Sharun

+0

Prova a mettere il tuo convertitore all'interno del datatrigger stesso e restituire un bool immediato da esso, piuttosto che il Nullable restituito ischecked. –

+0

Assicurati inoltre che IsThreeState sia falso. –

7

Provare a utilizzare WPF Ispettore:

https://wpfinspector.codeplex.com/

Una volta collegato all'applicazione WPF in esecuzione, evidenziare l'elemento in questione tenendo premuto CTRL + clic su di esso. Quindi, seleziona l'elemento nell'albero visivo (potrebbe essere un genitore) che contiene il trigger. Fai clic sulla scheda Trigger e puoi vedere la valutazione corrente (ad esempio True == True). Se la condizione del datatrigger è soddisfatta, la piccola icona sarà arancione (accesa).

+0

Ho provato ad usarlo ma la mia applicazione non è stata visualizzata nell'elenco delle applicazioni WPF. Hai qualche suggerimento per aggirare questo problema? – clcto

+1

Controlla la [fonte] (http://wpfinspector.codeplex.com/SourceControl/latest#trunk/source/Inspector/Services/ManagedApplicationsService.cs). Sembra che un'applicazione venga aggiunta alla lista se 'GetIsManagedApplication' restituisce true e il nome del processo non contiene" devenv "," PresentationHost "o" inspector ". Forse il nome del tuo progetto contiene una di quelle stringhe? Altrimenti, guarda nel codice che determina se un'applicazione è gestita. – Pakman

+0

Sì, contiene "Inspector" ... che sembra un modo piuttosto hacky per evitare di elencare la sua applicazione, ma suppongo di poter modificare la fonte. Per ora ho appena usato la risposta @DanLampings. – clcto