2010-07-22 13 views
6

Tengo un grupo de CheckBoxes de WPF que tienen un controlador de eventos Checked que maneja un poco de lógica cuando el usuario hace clic en uno de ellos. Sin embargo, también tengo un botón "Borrar todo" que, al hacer clic, borrará todas las casillas de verificación. Si el usuario hace clic en el botón "Borrar todo", NO quiero que las casillas activen su evento Controlado. ¿Hay alguna forma de hacer esto?¿Hay alguna manera de evitar que un WPF CheckBox active su evento Checked?

+0

Creo que quieres decir evento sin marcar ¿verdad? –

+0

Lo siento, el evento no seleccionado. –

Respuesta

4

Retire el controlador de eventos en el inicio de la Borrar en el controlador de eventos de botón Todo y luego volver a agregar el controlador de eventos en el extremo del botón Borrar todo del controlador de eventos.

He aquí una muestra sucia:

XAML

<Window x:Class="UncheckedTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <CheckBox Height="16" Margin="22,30,136,0" Name="checkBox1" VerticalAlignment="Top" 
        Unchecked="checkBox1_Unchecked">CheckBox 1</CheckBox> 
     <CheckBox Height="16" Margin="22,76,136,0" Name="checkBox2" VerticalAlignment="Top" 
        Unchecked="checkBox2_Unchecked">CheckBox 2</CheckBox> 
     <CheckBox Margin="22,0,136,121" Name="checkBox3" Height="16" VerticalAlignment="Bottom" 
        Unchecked="checkBox3_Unchecked">CheckBox 3</CheckBox> 
     <Button HorizontalAlignment="Right" Margin="0,118,37,121" Name="button1" Width="87" 
       Click="button1_Click">Uncheck All</Button> 
     <TextBox Height="74" Margin="22,0,20,13" Name="textBox1" VerticalAlignment="Bottom" 
       TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" /> 
    </Grid> 
</Window> 

Código Detrás

using System; 
using System.Windows; 

namespace UncheckedTest 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private int i = 1; 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     void checkBox3_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 3 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox2_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 2 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox1_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 1 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      checkBox1.Unchecked -= checkBox1_Unchecked; 
      checkBox2.Unchecked -= checkBox2_Unchecked; 
      checkBox3.Unchecked -= checkBox3_Unchecked; 

      checkBox1.IsChecked = false; 
      checkBox2.IsChecked = false; 
      checkBox3.IsChecked = false; 

      checkBox1.Unchecked += checkBox1_Unchecked; 
      checkBox2.Unchecked += checkBox2_Unchecked; 
      checkBox3.Unchecked += checkBox3_Unchecked; 
     } 
    } 
} 
+2

Gracias, esta solución parece un poco hack-ish, pero es probablemente la mejor manera de hacerlo. Otra solución viable es la proporcionada por Jeff, para crear una variable que se verifica para ver si debe procesar la lógica 'Checked'. –

1

Sería ideal para desactivar el evento, pero no sé cómo se haría eso.

Aunque sería tan fácil agregar un booleano para realizar un seguimiento si se presionó o no el botón "Borrar todo". Luego, solo haga el código Desmarcado si no fue desmarcado a través del botón.

private bool clearAllClicked = false; 

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    clearAllClicked = true; 
    checkbox.IsChecked = false; 
    clearAllClicked = false; 
} 

private void checkbox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    if (!clearAllClicked) 
    { 
     //do stuff 
    } 
} 
+0

Esta es una solución viable, pero me gustaría evitar tener que crear otra variable si es posible. –

18

Usted puede utilizar el evento 'click' en lugar de 'marcado' o 'No verificado ' eventos.

'Click' garantizará que el cambio de estado provendrá de la entrada del usuario (mediante el botón del mouse o la barra espaciadora, por ejemplo).

Y operaciones como cb.IsChecked = value no dispararán el evento 'Click'.

+0

¡Casi me olvidé de eso! En realidad podría resolver mi problema, ¡gracias! – Enrico

+0

Solo una advertencia, esto no se activa si se usa la barra espaciadora, que también puede alternar la entrada de la casilla de verificación. –

Cuestiones relacionadas