2015-06-05 79 views
5

首先 - 免責聲明:什麼首先執行:ToggleButton.IsChecked綁定更新或命令綁定?

如果你正在讀這篇文章,因爲你想同時使用用於 結合和器isChecked一個RelayCommand改變的事情,你可能正在做 是錯誤的。您應該調用IsChecked綁定的 Set()呼叫。

問題:

我有一個切換按鈕,其中有兩個綁定爲IsChecked併爲Command

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

是的 - 我知道,嘖嘖。無法幫助。

當用戶點擊ToggleButton時,這兩個將首先觸發?命令是被執行的,還是IsChecked綁定去更新綁定的屬性?或者 - 這實際上類似於社交上的帖子in which it creates a race condition

+0

@BradleyDotNET指出,social.msdn文章「有點不同,我認爲[那]三個命令之間存在競爭條件」。 –

回答

4

IsChecked在命令運行時將具有有效值。

ToggleButton覆蓋OnClickButtonBase這樣的:

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

OnToggle是更新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); 
    } 

和基座OnClick火災命令:

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

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

來源:MSDN Reference Source

因此,該值應該在命令運行時有效。

+0

刪除我的答案 - 這是更徹底。 –

+0

僅供參考,布拉德利 - 你的MSDN參考源鏈接^得到破壞: –

+0

@LynnCrumbling謝謝,好東西,我複製了代碼:)現在鏈接已修復 – BradleyDotNET