2009-01-05 3 views
14

Próbuję zrobić coś bardzo prostego. Mam właściwość ToggleButton.IsChecked powiązaną z boolem. Chcę, aby tło przełączało się między czerwonym (fałsz) i zielonym (prawda). Ale z jakiegoś powodu wydaje się, że przełącza się między czerwonym i bez tła. Użyłem konwertera, aby sprawdzić, czy otrzymuję odpowiednie powiadomienia od źródła i jestem, więc nie jestem pewien, dlaczego jeden wyzwalacz (fałszywy/czerwony) działa, a drugi (prawda/zielony) nie robi. Chciałbym również usłyszeć, jak ludzie debugują tego rodzaju problemy. Dzięki!WPF Debugowanie datatriggers?

Oto kod.

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

Aktualizacja: Zmieniłem ToggleButton do wyboru i to działa. Nie mam pojęcia, dlaczego ...

Odpowiedz

1

Dla mnie wygląda dobrze, możesz spróbować zmienić konwerter, aby powrócić "czerwony" lub "zielony" zamiast Prawdziwy/Fałszywy (i odpowiednio zmienić spust). Widziałem pewne dziwne zachowanie z wyzwalaczami WPF przy użyciu NULL lub Booleans w tym, że "unsets" właściwość, jeśli jest przeciwieństwem wartości wyzwalacza, a nie za pomocą innej wartości wyzwalacza.

chodzi o ich debugowania .. Chciałabym wiedzieć, czy istnieje lepszy sposób niż metody Hack and nadzieję, że zazwyczaj używają do XAML debugowania: D

+0

Dzięki za sugestię. Próbowałem, ale bez powodzenia. Nie rozumiem, dlaczego jeden spust wydaje się strzelać, a nie drugi. – Sharun

+0

Spróbuj umieścić konwerter wewnątrz samego datatriggera i zwróć z niego prosty sygnał, a nie Nullable , który jest zaznaczony. –

+0

Upewnij się także, że IsThreeState ma wartość false. –

7

Spróbuj użyć WPF inspektora:

https://wpfinspector.codeplex.com/

Po dołączeniu do uruchomionej aplikacji WPF wyróżnij dany element, przytrzymując naciśnięty klawisz CTRL + kliknięcie. Następnie wybierz element w drzewie wizualnym (może być rodzicem), który zawiera wyzwalacz. Kliknij kartę wyzwalaczy i możesz zobaczyć bieżącą ocenę (np. True == True). Jeśli stan danych jest spełniony, mała ikona będzie pomarańczowa (świeci).

+0

Próbowałem użyć tego, ale moja aplikacja nie pojawiła się na liście aplikacji WPF. Czy masz jakieś wskazówki dotyczące obejścia tego problemu? – clcto

+1

Sprawdź [źródło] (http://wpfinspector.codeplex.com/SourceControl/latest#trunk/source/Inspector/Services/ManagedApplicationsService.cs). Wygląda na to, że aplikacja zostanie dodana do listy, jeśli "GetIsManagedApplication" zwróci true, a nazwa procesu nie zawiera "devenv", "PresentationHost" lub "inspector". Być może nazwa twojego projektu zawiera jeden z tych łańcuchów? W przeciwnym razie sprawdź kod, który określa, czy aplikacja jest zarządzana. – Pakman

+0

Tak, zawiera "Inspektora", który wydaje się być dość hackowskim sposobem na uniknięcie wpisania własnej aplikacji, ale domyślam się, że mógłbym zmodyfikować źródło. Na razie użyłem odpowiedzi @DanLampings. – clcto