2009-08-27 25 views
10

Tôi có một CheckBox trong ứng dụng đang sử dụng chế độ TriState. Các hành vi bình thường cho chế độ này có vẻ là đi xe đạp giữa null, false, true.TriState Checkbox - cách thay đổi thứ tự của các trạng thái

Tôi muốn thay đổi hành vi này để nó hoạt động giữa null, true, false.

Cách tốt nhất để làm điều này là gì?

Tôi đã thử thêm một handler nhấp chuột tương tự như sau:

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

} 

Nhưng điều này dường như bỏ đi hoàn toàn. Tôi khá chắc chắn tôi đang thiếu một cái gì đó mà nên được rõ ràng.

Trả lời

22

Tôi đoán xử lý sự kiện và hành vi mặc định chỉ là hủy bỏ hiệu ứng của nhau, vì vậy các hộp kiểm dường như khuyết tật ...

Thật sự tôi gần đây đã phải làm điều tương tự. Tôi phải kế thừa từ CheckBox và ghi đè 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(); 
     } 
    } 
} 
Các vấn đề liên quan