簡體   English   中英

首先執行什么:ToggleButton.IsChecked綁定更新,還是命令綁定?

[英]What executes first: ToggleButton.IsChecked binding update, or Command binding?

首先 - 免責聲明:

如果您正在閱讀此內容,因為您想同時使用IsChecked的綁定和RelayCommand來更改內容,那么您可能做錯了。 您應該使用IsChecked綁定的Set()調用。

問題:

我有一個ToggleButton,其中有IsCheckedCommand的綁定:

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

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

當用戶點擊ToggleButton時,這兩個將首先觸發? Command是否會被執行,或者IsChecked綁定是否會更新綁定屬性? 或者 - 這實際上類似於創造競爭條件的社交帖子嗎?

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

ToggleButtonButtonBase重寫OnClick ,如下所示:

    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參考資料來源

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM