2009-08-27 7 views
10

J'ai un CheckBox dans mon application qui utilise le mode TriState. Le comportement normal pour ce mode semble faire un cycle entre null, false, true.TriState Case à cocher - comment changer l'ordre des états

Je voudrais changer ce comportement afin qu'il passe entre null, true, false.

Quelle est la meilleure façon de faire cela?

J'ai essayé d'ajouter un gestionnaire de clic semblable à ceci:

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; 
    } 

} 

Mais cela semble tout à fait désactiver la case à cocher. Je suis sûr que je manque quelque chose qui devrait être évident.

Répondre

22

Je suppose que le gestionnaire d'événements et le comportement par défaut sont tout simplement annulaient les effets de l'autre, de sorte que la case à cocher semble désactivé ...

En fait, je récemment eu à faire la même chose. J'ai dû hériter de CheckBox et remplacer 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(); 
     } 
    } 
} 
Questions connexes