Die OneWay-Bindung für ToggleButton-das IsChecked-Eigenschaft in WPF
Ich habe eine ToggleButton
mit seinen IsChecked
- Eigenschaft an eine Eigenschaft mit einem OneWay-Bindung.
<ToggleButton
Command="{Binding Path=SomeCommand}"
IsChecked="{Binding Path=SomeProperty, Mode=OneWay}" />
Den SomeCommand
schaltet die Boolesche SomeProperty
Wert, und ein PropertyChanged
- Ereignis ausgelöst wird, für SomeProperty
.
Wenn ich SomeProperty
in meinem viewmodel die ToggleButton
drückt richtig. Jedoch wenn ich auf die ToggleButton
die Bindung scheint verloren zu gehen, und die Taste nicht mehr erhält, überprüft nach dem Wert SomeProperty
. Irgendwelche Ideen auf, wie dieses problem zu lösen?
- Was macht Ihr SomeCommand tun? Ich habe eine Anzahl von ToggleButtons, die das gleiche tun, mit der gleichen Art der Bindung, und alle SomeCommand tut, ist, Annulliere den aktuellen Wert SomeProperty.
- SomeProperty war tatsächlich ein anderer Typ und ich war mit einem Konverter zu ändern, um einen booleschen Wert. Ich, dass Links, um die Frage einfacher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist by design bei der Verwendung von oneway-Daten verbindlich. Fügen Sie die angefügte Eigenschaft PresentationTraceSources.TraceLevel=High, um Ihre Bindung und Sie werden sehen, wenn es getrennt wird. Dieser link beschreibt das problem auch (ohne Angebot keine Lösung): Debuggen von Data Binding in WPF
Die Art und Weise, die ich normalerweise nicht lösen, es ist mit einem Befehl für die Interaktion der Nutzer und code-behind zu verändern, die Kontrolle Aussehen, weil einige der veränderten Eigenschaften.
Gibt es eine einfache und elegante Weise zu lösen, die original-poster, das problem - ersetzen IsChecked-Eigenschaft des ToggleButton mit einem verknüpfbaren Eigenschaft, die festgelegt wird IsChecked der Taste ändern handler:
XAML wird dann wie folgt Aussehen:
EDIT: Die OP-Lösung funktioniert nicht, weil, wenn Sie die Taste gedrückt, wird die IsChecked-Eigenschaft wird im code festgelegt (dies ist die Möglichkeit, MS umgesetzt Umschaltfeld-Steuerelement) - Einstellung der Eigenschaft entfernt die Bindung von es und so es nicht mehr funktioniert.
Durch die Verwendung von angefügten Eigenschaft können wir dieses problem zu überwinden, denn es ist nie ein Wert zugewiesen, in der code und damit die Bindungen intakt bleibt.
Ich habe ähnliches problem.
Ist es nicht "die Bindung scheint verloren zu gehen" (es sei denn, es ist früher frameworks Probleme). Bindung weiter arbeiten und kann leicht bewiesen durch ändern der Eigenschaft außerhalb , dass der Befehl (z.B. im handler eine andere Schaltfläche click-Ereignis/Befehl).
Das problem ist, was
IsChecked
verändert werden kann, zwei Möglichkeiten: 1) Bindung (wenn der Wert derSomeProperty
geändert wird, wird die Schaltfläche aktualisiert, 2) Benutzer (wenn der Benutzer die Taste drücken, ändert erIsChecked
aber Bindung istOneWay
soSomeProperty
wird nicht aktualisiert).So können Sie desync tritt auf, wenn
SomeProperty == false
aber buttonIsChecked == true
oder vice-versa.Um die Leistung zu optimieren Mechanismus für die Bindung ist die überprüfung, ob der neue Wert unterscheidet sich vom aktuellen. Also, wenn desync Auftritt und Sie versuchen, zu aktualisieren
SomeProperty
mit dem Wert, die es bereits haben, dann wird auch nichts passiert.Abhilfe ist einfach: aktualisieren Sie die Eigenschaft in 2 Schritten
wo
set
ist der Wert, den Sie benötigen (z.B. gegenüber aktuellenSomeProperty
).Ich denke, was das problem reduziert sich zu einem Konflikt zwischen dem Befehl und der
IsChecked
verbindlich. Meine Lösung war, meine viewmodel zu entlarven einebool?
und binden, dass dieIsChecked
Eigenschaft. Ich nicht binden Sie einen Befehl an denToggleButton
. An anderer Stelle in meinem code, wo ich will, zum Umschalten der Eigenschaft, die ich verwendenSomeCommand
.Meines Wissens Sinatr korrekt ist in Bezug auf die "desync', das Auftritt, zumindest in neueren frameworks.
Eine weitere einfache Möglichkeit, um das Problem zu entfernen, die mode=oneway-und implementieren eine leere setter. Ex:
Mit dieser verbindlichen setup können Sie ändern Sie den Wert der backing-variable von Ihrem Befehl verbindliche Funktion, oder ob Sie müssen. Denken Sie daran, zu nennen RaisePropertyChanged.