2009-08-27 24 views
10

tengo una casilla de verificación mi aplicación que está utilizando el modo de TriState. El comportamiento normal para este modo parece estar variando entre nulo, falso, verdadero.TriState Casilla - cómo cambiar el orden de los estados

me gustaría cambiar este comportamiento para que entre ciclos nula, verdadero, falso.

¿Cuál es la mejor manera de hacerlo?

He intentado añadir un controlador de clic similar a esto:

void cb_Click(object sender, RoutedEventArgs e) 
{ 
    if (((CheckBox)e.Source).IsChecked.HasValue == false) 
    { 
     ((CheckBox)e.Source).IsChecked = true; 
     return; 
    } 

    if (((CheckBox)e.Source).IsChecked == true) 
    { 
     ((CheckBox)e.Source).IsChecked = false; 
     return; 
    } 

    if (((CheckBox)e.Source).IsChecked == false) 
    { 
     ((CheckBox)e.Source).IsChecked = null; 
     return; 
    } 

} 

pero esto parece desactivar la casilla de verificación en su totalidad. Estoy bastante seguro de que me estoy perdiendo algo que debería ser obvio.

Respuesta

22

supongo que el controlador de eventos y el comportamiento por defecto sólo están cancelando los efectos del otro, por lo que la casilla de verificación que parece desactivado ...

hecho recientemente he tenido que hacer lo mismo. Tuve que heredar de CheckBox y anular OnToggle:

public class MyCheckBox : CheckBox 
{ 


    public bool InvertCheckStateOrder 
    { 
     get { return (bool)GetValue(InvertCheckStateOrderProperty); } 
     set { SetValue(InvertCheckStateOrderProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for InvertCheckStateOrder. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty InvertCheckStateOrderProperty = 
     DependencyProperty.Register("InvertCheckStateOrder", typeof(bool), typeof(MyCheckBox), new UIPropertyMetadata(false)); 

    protected override void OnToggle() 
    { 
     if (this.InvertCheckStateOrder) 
     { 
      if (this.IsChecked == true) 
      { 
       this.IsChecked = false; 
      } 
      else if (this.IsChecked == false) 
      { 
       this.IsChecked = this.IsThreeState ? null : (bool?)true; 
      } 
      else 
      { 
       this.IsChecked = true; 
      } 
     } 
     else 
     { 
      base.OnToggle(); 
     } 
    } 
} 
Cuestiones relacionadas