2010-10-13 20 views
7

HI, Estoy trabajando en WPF y tengo un requisito interesante. Necesito que mis casillas de verificación sean ThreeState, por lo que si solo se seleccionan algunos de los elementos secundarios se muestra como indeterminado. Pero cuando un uso hace clic en él, quiero que seleccione verdadero o falso.Obligar a una casilla de verificación para que no se mueva a un estado indeterminado

Aquí es una historia para representar mis requisitos:

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

Cuando un usuario hace clic en item, la casilla de verificación debe alternarse entre marcado y sin marcar. El usuario nunca debería poder seleccionar 'indeterminado' como un estado. es posible?

Respuesta

17

XAML:

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

de código subyacente:

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

Si no te gusta el código detrás de la solución, entonces se podría subclase su propio control como en la solución de this pregunta.

+0

Bingo! gracias amigo. Intenté con el evento indeterminado y no funcionó, pero hizo clic en ... extraño :) – TerrorAustralis

12

Es mucho más fácil si utiliza Enlace con su CheckBox.

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> 

de código subyacente:

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

que vea el punto? Establece CheckBox en IsThreeState = "False", pero establece el tercer estado desde CodeBehind y CheckBox se comporta como se esperaba.

Cuestiones relacionadas