2015-06-05 13 views
5

Pierwszy - Zastrzeżenie:Co wykonuje się najpierw: aktualizacja wiązania ToggleButton.IsChecked lub powiązanie poleceń?

Jeśli czytasz to, ponieważ chcesz użyć zarówno wiążące dla IsChecked i RelayCommand aby zmienić ten stan rzeczy, prawdopodobnie robią to źle. Powinieneś pracować nad wywołaniem wiązania .

Pytanie:

Mam ToggleButton w którym istnieje zarówno wiążące dla IsChecked i przez Command:

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

Tak - wiem, tsk tsk. Nie można pomóc.

Kiedy użytkownik kliknie przycisk ToggleButton, który zostanie uruchomiony najpierw? Czy polecenie zostanie wykonane, czy też wiąże się IsChecked, aby zaktualizować powiązaną właściwość? Lub - czy jest to faktycznie podobne do postu w serwisie społecznościowym in which it creates a race condition?

+0

@BradleyDotNET zwrócił uwagę, że post "social.msdn" jest "trochę inny, myślę, że [istnieje] wyścig między trzema komendami". –

Odpowiedz

4

IsChecked będzie mieć poprawną wartość w czasie wykonywania polecenia.

ToggleButton nadpisania OnClick od ButtonBase tak:

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

OnToggle jest metoda, która aktualizuje IsChecked:

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); 
    } 

a podstawa OnClick pożarów polecenie:

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

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

Źródło: MSDN Reference Source

Wartość powinna być poprawna do czasu uruchomienia polecenia.

+0

Usunięto moją odpowiedź - jest to o wiele dokładniejsze. –

+0

FYI, Bradley - Twój Link Źródłowy MSDN Ref^został rozwalony :( –

+0

@LynnCrumbling Dzięki, dobrze, że skopiowałem kod :) Link jest już naprawiony – BradleyDotNET

Powiązane problemy