代码之家  ›  专栏  ›  技术社区  ›  TerrorAustralis

强制三态复选框不移动到不确定状态

  •  9
  • TerrorAustralis  · 技术社区  · 15 年前

    我在WPF工作,我有一个有趣的要求。 我需要我的复选框是三态的,所以如果只选择了一些子元素,它将显示为不确定。但是当用户点击它时,我希望它选择true或false。

    这里有一个故事来表达我的要求:

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

    当用户单击 item

    2 回复  |  直到 7 年前
        1
  •  19
  •   Community Mohan Dere    8 年前

    XAML:

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

    代码隐藏:

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

    this 问题。

        2
  •  15
  •   GreenEyedAndy    11 年前

    如果使用复选框绑定会容易得多。

    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>
    

    代码隐藏:

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