什么会先执行:ToggleButton.IsChecked绑定更新还是Command绑定?

8

首先,免责声明:

如果您正在阅读本文是因为您想同时使用IsChecked绑定和RelayCommand来更改内容,那么您可能是在错误的道路上。你应该使用IsChecked绑定的Set()调用。

问题:

我有一个ToggleButton,在其中既有IsChecked的绑定,也有Command的绑定:

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

是的 - 我知道,这是不好的。

当用户单击Toggle按钮时,这两个哪一个会先触发?Command会被执行,还是IsChecked绑定会更新绑定的属性?或者 - 这实际上类似于社交媒体上的帖子,在其中创建了一种竞争条件


@BradleyDotNET 指出 social.msdn 帖子“有点不同,我认为[在这里]存在三个命令之间的竞态条件”。 - Lynn Crumbling
嗨,这个免责声明背后的理由是什么?我有一个情况,当我想要分别控制属性值和动作时。复选框会同时执行两个操作,但程序的其他部分希望独立进行。 - yatskovsky
1个回答

7

IsChecked将在命令运行时具有有效值。

ToggleButton像这样覆盖了ButtonBaseOnClick

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

来源:微软开发者网络参考源

因此,在命令运行时,该值应该是有效的。


删除了我的回答——这个更加详细。 - Michael G
FYI,Bradley - 你的 MSDN Ref Source 链接挂了 :( - Lynn Crumbling
@LynnCrumbling 谢谢,幸好我复制了代码 :) 链接现在已修复 - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接