2009-08-27 7 views
10

Ho un CheckBox nella mia applicazione che sta utilizzando la modalità TriState. Il comportamento normale per questa modalità sembra essere ciclico tra null, false, true.Casella di controllo TriState - come modificare l'ordine degli stati

Mi piacerebbe cambiare questo comportamento in modo che passi tra null, true, false.

Qual è il modo migliore per farlo?

Ho provato ad aggiungere un gestore di click simile a questo:

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

} 

ma questo sembra per disabilitare la casella di controllo del tutto. Sono abbastanza sicuro che mi manca qualcosa che dovrebbe essere ovvio.

risposta

22

Credo che il gestore di eventi e il comportamento di default sono solo annullando gli effetti di ciascuno, così la casella di controllo sembra disabilitato ...

realtà Recentemente ho dovuto fare la stessa cosa. Ho dovuto ereditare da CheckBox e scavalcare 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(); 
     } 
    } 
} 
Problemi correlati