2015-06-05 2 views
5

Erste - ein Haftungsausschluss:Was wird zuerst ausgeführt: ToggleButton.IsChecked-Bindungsaktualisierung oder Befehlsbindung?

Wenn Sie diese Zeilen lesen, weil Sie beide eine Bindung für IsChecked und RelayCommand die Dinge zu ändern verwenden möchten, tun Sie wahrscheinlich es falsch. Sie sollten von der Bindung Set() Aufruf arbeiten.

Die Frage:

Ich habe einen ToggleButton, in dem es sowohl eine Bindung für IsChecked und für eine Command:

<ToggleButton IsChecked="{Binding BooleanBackedProperty}" 
     Command="{Binding SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
     CommandParameter="{Binding}" /> 

Ja - ich weiß, tsk tsk. Konnte nicht geholfen werden.

Wenn der Benutzer auf den ToggleButton klickt, den diese beiden zuerst auslösen sollen? Wird der Befehl ausgeführt oder wird die IsChecked-Bindung die gebundene Eigenschaft aktualisieren? Oder - ist das tatsächlich ähnlich dem Beitrag auf Social in which it creates a race condition?

+0

@BradleyDotNET wies darauf hin, dass der Beitrag von social.msdn "ein wenig anders ist, denke ich, [in diesem] gibt es eine Wettlaufbedingung zwischen drei Befehlen". –

Antwort

4

IsChecked haben einen gültigen Wert zur Befehlslaufzeit.

ToggleButton überschreibt OnClick von ButtonBase wie folgt aus:

protected override void OnClick() 
    { 
     OnToggle(); 
     base.OnClick(); 
    } 

OnToggle ist die Methode, die IsChecked aktualisiert:

protected internal virtual void OnToggle() 
    { 
     // If IsChecked == true && IsThreeState == true ---> IsChecked = null 
     // If IsChecked == true && IsThreeState == false ---> IsChecked = false 
     // If IsChecked == false       ---> IsChecked = true 
     // If IsChecked == null       ---> IsChecked = false 
     bool? isChecked; 
     if (IsChecked == true) 
      isChecked = IsThreeState ? (bool?)null : (bool?)false; 
     else // false or null 
      isChecked = IsChecked.HasValue; // HasValue returns true if IsChecked==false 
     SetCurrentValueInternal(IsCheckedProperty, isChecked); 
    } 

und die Basis OnClick Feuer der Befehl:

protected virtual void OnClick() 
    { 
     RoutedEventArgs newEvent = new RoutedEventArgs(ButtonBase.ClickEvent, this); 
     RaiseEvent(newEvent); 

     MS.Internal.Commands.CommandHelpers.ExecuteCommandSource(this); 
    } 

Quelle: MSDN Reference Source

Also sollte der Wert gültig sein, wenn der Befehl ausgeführt wird.

+0

Löschte meine Antwort - das ist viel gründlicher. –

+0

FYI, Bradley - Ihre MSDN Ref Source link^hat busted :( –

+0

@LynnCrumbling Danke, gute Sache habe ich den Code kopiert :) Link ist jetzt behoben – BradleyDotNET

Verwandte Themen