有一种简单而优雅的方法可以解决原始海报的问题 - 将 ToggleButton 的 IsChecked 属性替换为可在其更改处理程序中设置按钮的 IsChecked 的可附加属性:
namespace TBFix
{
public class TBExtender
{
public static readonly DependencyProperty IsCheckedProperty =
DependencyProperty.RegisterAttached("IsChecked",
typeof(bool),
typeof(TBExtender),
new PropertyMetadata(OnChanged));
public static bool GetIsChecked(DependencyObject obj)
{
return (bool)obj.GetValue(IsCheckedProperty);
}
public static void SetIsChecked(DependencyObject obj, bool value)
{
obj.SetValue(IsCheckedProperty, value);
}
private static void OnChanged(DependencyObject o,
DependencyPropertyChangedEventArgs args)
{
ToggleButton tb = o as ToggleButton;
if (null != tb)
tb.IsChecked = (bool)args.NewValue;
}
}
}
然后 XAML 将如下所示:
<ToggleButton Command="{Binding Path=SomeCommand}"
TBFix:TBExtender.IsChecked="{Binding Path=SomeProperty,
Mode=OneWay}" />
编辑:OP 解决方案不起作用,因为当按下按钮时,代码中设置了 IsChecked 属性(这是 MS 实现 ToggleButton 控件的方式) - 设置属性会从中删除绑定,因此它停止工作。
通过使用附加属性,我们可以克服这个问题,因为它从来没有在代码中赋值,所以绑定保持不变。