首先执行什么:ToggleButton.IsChecked绑定更新,或Command绑定

本文关键字:绑定 更新 Command IsChecked ToggleButton 执行 什么 | 更新日期: 2023-09-27 17:53:52

首先-免责声明:

如果你正在阅读这篇文章,因为你想同时使用绑定IsChecked和RelayCommand来改变你可能正在做的事情错了。你应该摆脱IsChecked的束缚Set()电话。

:

我有一个ToggleButton,其中有IsCheckedCommand的绑定:

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

是的-我知道,啧啧。没办法。

当用户点击ToggleButton时,哪一个会先触发?Command将被执行,还是IsChecked绑定将更新绑定属性?或者,这实际上类似于在社会上的帖子,它创造了一个竞争条件?

首先执行什么:ToggleButton.IsChecked绑定更新,或Command绑定

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参考来源

所以该值在命令运行时应该是有效的