首先执行什么:ToggleButton.IsChecked绑定更新,或Command绑定
本文关键字:绑定 更新 Command IsChecked ToggleButton 执行 什么 | 更新日期: 2023-09-27 17:53:52
首先-免责声明:
如果你正在阅读这篇文章,因为你想同时使用绑定IsChecked和RelayCommand来改变你可能正在做的事情错了。你应该摆脱
IsChecked
的束缚Set()
电话。
:
我有一个ToggleButton,其中有IsChecked
和Command
的绑定:
<ToggleButton IsChecked="{Binding BooleanBackedProperty}"
Command="{Binding SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding}" />
是的-我知道,啧啧。没办法。
当用户点击ToggleButton时,哪一个会先触发?Command将被执行,还是IsChecked绑定将更新绑定属性?或者,这实际上类似于在社会上的帖子,它创造了一个竞争条件?
IsChecked
将在命令运行时具有一个有效值。
ToggleButton
从ButtonBase
重写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参考来源
所以该值在命令运行时应该是有效的