2010-10-13 22 views
7

HI, Tôi đang làm việc trong WPF và tôi có một yêu cầu thú vị. Tôi cần hộp kiểm của mình là ThreeState, vì vậy nếu chỉ một số phần tử con được chọn, nó sẽ hiển thị là không xác định. Nhưng khi sử dụng nhấp vào nó, tôi muốn nó chọn đúng hoặc sai.Bắt buộc hộp kiểm threestate không di chuyển đến trạng thái không xác định

Đây là một câu chuyện để đại diện cho các yêu cầu của tôi:

item - indeterminate 
    subItem - checked 
    subItem - unchecked 
    subItem - checked 

Khi người dùng nhấp item, hộp kiểm nên luân phiên giữa kiểm tra và không được kiểm soát. Người dùng sẽ không bao giờ có thể chọn 'không xác định' làm trạng thái. Điều này có thể không?

Trả lời

17

XAML:

<CheckBox IsThreeState="True" IsChecked="{x:Null}" Click="CheckBox_Clicked" /> 

Mã-đằng sau:

private void CheckBox_Clicked(object sender, RoutedEventArgs e) 
    { 
    var cb = e.Source as CheckBox; 
    if (!cb.IsChecked.HasValue) 
     cb.IsChecked = false; 
    } 

Nếu bạn không thích các code-behind giải pháp, sau đó bạn có thể sub-class kiểm soát của riêng bạn như thế nào trong các giải pháp cho this câu hỏi.

+0

Bingo! cảm ơn bạn đời. Đã thử nó với sự kiện không xác định và nó không hoạt động, nhưng nhấp vào ... lạ :) – TerrorAustralis

12

Sẽ dễ dàng hơn nhiều nếu bạn sử dụng Ràng buộc với Hộp kiểm của mình.

XAML:

<Window x:Class="WpfApplication39Checkbox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="128,95,0,0" VerticalAlignment="Top" IsThreeState="False" IsChecked="{Binding CheckState}"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="46,241,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="139,241,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="235,241,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/> 
    </Grid> 
</Window> 

Mã-đằng sau:

using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using System.Windows; 

namespace WpfApplication39Checkbox 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     private bool? checkState; 

     public bool? CheckState 
     { 
      get { return checkState; } 
      set 
      { 
       checkState = value; 
       OnPropertyChanged("CheckState"); 
      } 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      CheckState = false; 
     } 

     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      CheckState = true; 
     } 

     private void Button_Click_2(object sender, RoutedEventArgs e) 
     { 
      CheckState = null; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Bạn nhìn thấy điểm? Bạn đặt CheckBox thành IsThreeState = "False" nhưng đặt trạng thái thứ ba từ CodeBehind và CheckBox hoạt động như mong đợi.

Các vấn đề liên quan