繁体   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