Я недавно столкнулся с этой проблемой. Я смотрю все ответы на этот вопрос, но ни один, кажется, не подходит мне. Принятый ответ - сбой, когда я установил IsChecked
равно false в ViewModel. Я снимаю флажок в wpf.
Как вы можете видеть, когда вы устанавливаете флажок NULL IsChecked
, свойство IsChecked
изменится на false.
protected internal virtual void OnToggle()
{
bool? flag;
if (this.IsChecked == true)
{
flag = (this.IsThreeState ? null : new bool?(false));
}
else
{
flag = new bool?(this.IsChecked.HasValue);
}
base.SetCurrentValueInternal(ToggleButton.IsCheckedProperty, flag);
}
Таким образом, вы можете создать новый класс наследовать CheckBox
и переопределить OnToggle
метод следующим образом:
protected override void OnToggle()
{
bool? flag;
if (this.IsChecked == true)
{
flag = this.IsThreeState ? null : new bool?(false);
}
else
flag = true;
// what a pity this method is internal
// actually you can call this method by reflection
base.SetCurrentValueInternal(ToggleButton.IsCheckedProperty, flag);
}
Другой способ:
protected override void OnToggle()
{
if (this.IsChecked == null)
this.IsChecked = false;
base.OnToggle();
}