2009-08-27 13 views
10

Ich habe eine CheckBox in meiner Anwendung, die den TriState-Modus verwendet. Das normale Verhalten für diesen Modus scheint zwischen Null, Falsch, Wahr zu wechseln.TriState Checkbox - wie man die Reihenfolge der Zustände ändert

Ich möchte dieses Verhalten so ändern, dass es zwischen null, wahr, falsch wechselt.

Was ist der beste Weg, dies zu tun?

Ich habe versucht, einen Click-Handler ähnlich wie diese hinzu:

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

} 

Aber das scheint ganz auf das Kontrollkästchen zu deaktivieren. Ich bin mir ziemlich sicher, dass ich etwas vermisse, das offensichtlich sein sollte.

Antwort

22

ich denke, der Event-Handler und das Standardverhalten sind Cancelling nur jeder Effekte des anderen, so die Checkbox scheint deaktiviert ...

Eigentlich tun musste ich vor kurzem das gleiche. Ich musste von CheckBox erben und überschreiben 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(); 
     } 
    } 
} 
Verwandte Themen