元の投稿者の問題を解決するためのシンプルでエレガントな方法があります。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}" />
編集:ボタンが押されるとIsCheckedプロパティがコードに設定されるため(これはMSがToggleButtonコントロールを実装する方法です)、OPソリューションは機能しません-プロパティを設定すると、バインディングが削除され、機能しなくなります。
アタッチされたプロパティを使用することで、この問題を克服できます。これは、コードで値が割り当てられることがなく、バインディングがそのまま維持されるためです。