2010-07-22 1 views
6

Possiedo un gruppo di checkbox WPF con un gestore eventi controllato che gestisce una logica quando l'utente fa clic su uno di essi. Tuttavia, ho anche un pulsante "Cancella tutto" che, quando si fa clic, cancella tutte le caselle di controllo. Se l'utente fa clic sul pulsante "Cancella tutto", NON voglio che le caselle di controllo attivino l'evento verificato. C'è un modo per farlo?Esiste un modo per impedire a un CheckBox WPF di attivare l'evento controllato?

+0

Credo che tu intenda l'evento Unchecked giusto? –

+0

Giusto mi dispiace, l'evento Unchecked. –

risposta

4

Rimuovere il gestore di eventi all'inizio della a Clear gestore di eventi tutto del pulsante e quindi aggiungere nuovamente il gestore di eventi alla fine del gestore di eventi Cancella tutto del pulsante.

Ecco un esempio sporca:

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> 

Codice Dietro

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

Grazie, questa soluzione sembra un po 'hack-ish ma è probabilmente il modo migliore per andare. Un'altra soluzione praticabile è quella fornita da Jeff, per creare una variabile che viene controllata per vedere se deve elaborare la logica 'Controllata'. –

1

Sarebbe l'ideale per disabilitare l'evento ma non so come sarebbe stato fatto.

Anche se sarebbe altrettanto semplice aggiungere un booleano per tenere traccia se è stato premuto o meno il pulsante "Cancella tutto". Quindi, esegui il codice Unchecked solo se non è stato deselezionato tramite il pulsante.

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

Questa è una soluzione valida, ma mi piacerebbe evitare di dover creare un'altra variabile se possibile. –

18

È possibile utilizzare l'evento 'Click' invece di 'Controllato' o 'non controllato 'eventi.

'Fare clic' per garantire che il cambiamento di stato verrà dall'input dell'utente (tramite il pulsante del mouse o la barra spaziatrice per esempio).

E operazioni come cb.IsChecked = value non attivano l'evento "Click".

+0

Quasi dimenticato! Potrebbe effettivamente risolvere il mio problema, grazie! – Enrico

+0

Solo un avvertimento, Questo non si innesca se si utilizza la barra spaziatrice che può anche commutare l'input della casella di controllo. –