首先 - 免责声明:
如果您正在阅读此内容,因为您要同时使用绑定 IsChecked和RelayCommand改变了一些事情,你可能正在做 错了。您应该使用
IsChecked
绑定Set()
致电。
问题:
我有一个ToggleButton,其中包含IsChecked
和Command
的绑定:
<ToggleButton IsChecked="{Binding BooleanBackedProperty}"
Command="{Binding SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding}" />
是的 - 我知道,tsk tsk。无法帮助。
当用户点击ToggleButton时,这两个将首先触发? Command是否会被执行,或者IsChecked绑定是否会更新绑定属性?或者 - 这实际上类似于社交in which it creates a race condition上的帖子吗?
答案 0 :(得分:4)
IsChecked
在命令运行时将具有有效值。
ToggleButton
会覆盖OnClick
ButtonBase
,如下所示:
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);
}
因此,该值应在命令运行时有效。