C'è un modo semplice ed elegante per risolvere il problema del manifesto originale - sostituire beni IsChecked del ToggleButton con una proprietà attaccabile che fisserà IsChecked del pulsante nel suo gestore cambiamento:
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 poi sarà simile a questa:
<ToggleButton Command="{Binding Path=SomeCommand}"
TBFix:TBExtender.IsChecked="{Binding Path=SomeProperty,
Mode=OneWay}" />
EDIT: la soluzione OP non funziona, perché quando si preme il pulsante la proprietà IsChecked si trova nel codice (questo è il modo MS implementato controllo ToggleButton) - impostando la proprietà rimuove il vincolante om it e quindi smette di funzionare.
Utilizzando la proprietà associata, è possibile risolvere questo problema perché non viene mai assegnato un valore nel codice e pertanto i binding rimangono intatti.
fonte
2011-04-28 17:21:17
Cosa fa il tuo SomeCommand? Ho un numero di ToggleButtons che fanno la stessa cosa, con lo stesso tipo di binding, e tutti SomeCommand fa negare il valore corrente di SomeProperty. –
SomeProperty era in realtà un tipo diverso e stavo usando un convertitore per cambiarlo in un booleano. L'ho lasciato fuori per rendere la domanda più semplice. –