Es gibt einen einfachen und eleganten Weg, um das Problem des ursprünglichen Posters zu lösen - das Ersetzen der IsChecked-Eigenschaft des ToggleButtons durch eine attachable-Eigenschaft, die IsChecked des Buttons in seinem Change-Handler setzt:
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 sieht dann wie folgt aus:
<ToggleButton Command="{Binding Path=SomeCommand}"
TBFix:TBExtender.IsChecked="{Binding Path=SomeProperty,
Mode=OneWay}" />
EDIT: Die OP-Lösung funktioniert nicht, weil, wenn die Schaltfläche gedrückt wird, die IsChecked-Eigenschaft im Code festgelegt ist (dies ist die Art und Weise MS implementiert ToggleButton-Steuerelement) - Einstellung der Eigenschaft entfernt die Bindung von ihm und so es nicht mehr funktioniert.
Durch die Verwendung der angehängten Eigenschaft können wir dieses Problem umgehen, da ihr im Code nie ein Wert zugewiesen wird und die Bindungen somit intakt bleiben.