Сделать флажок привязанным к nullable bool при переходе от нуля к истине - PullRequest
4 голосов
/ 15 марта 2011

У меня есть флажок с его свойством IsChecked, связанным с обнуляемым bool.Когда мой элемент управления впервые загружается, значение равно нулю, а флажок отображается серым цветом.Это то, что я хочу.

Когда пользователь нажимает на флажок, он переходит в состояние false / Unchecked.

Однако 99% времени пользователь захочет поставить галочкуфлажок - который в настоящее время означает двойной щелчок флажка.

Как я могу заставить значение переместиться с нуля на истину, когда пользователь впервые нажимает флажок?

Ответы [ 5 ]

6 голосов
/ 13 августа 2015

У меня была такая же проблема, и я столкнулся с этим вопросом.Это поздний ответ, но я думаю, что это лучшее решение:)

С помощью IsThreeState и TargetNullValue вы можете выполнить это

 <CheckBox  IsThreeState="False" IsChecked="{Binding YOUR_NULLABLE_PROPERTY, TargetNullValue=false}" />

Единственное предостережение заключается в том, чтоон будет переключаться между нулем и истиной.Там никогда не будет ложное значение.

6 голосов
/ 15 марта 2011

Вы можете просто изменить установщик связанного свойства, чтобы проверить, является ли предыдущее значение нулевым, и если это так, установите значение true. Как то так:

public bool? MyBoolProperty 
{
   get { return _myBoolProperty; }
   set 
   {
       _myBoolProperty = (_myBoolProperty != null || value == null) ? value : true;
       RaisePropertyChanged("MyBoolProperty");       
   }
}

Система привязки перечитает свойство после того, как оно его установит, поэтому новое значение будет отражено CheckBox.

3 голосов
/ 15 марта 2011

Вы можете обработать событие Click и реализовать логику следующим образом:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
  CheckBox cb = sender as CheckBox;

  switch (cb.IsChecked) 
  {
    case null:
      cb.IsChecked = false;
      break;

    case true:
      cb.IsChecked = true;
      break;

    case false:
      if (cb.IsThreeState) {
        cb.IsChecked = null;
      } else {
        cb.IsChecked = true;
      }
      break;
  }

  e.Handled = true;

}
1 голос
/ 27 марта 2018

Я недавно столкнулся с этой проблемой. Я смотрю все ответы на этот вопрос, но ни один, кажется, не подходит мне. Принятый ответ - сбой, когда я установил 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();
}
0 голосов
/ 15 марта 2011

Самый простой способ - просто обработать событие click и установить для элемента управления значение true, если его текущее состояние равно null, при желании можно установить flag для внутреннего отслеживания кода после первого щелчка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...