2010-07-22 13 views
6

Ich habe eine Gruppe von WPF-CheckBoxes, die einen Checked-Event-Handler haben, der Logik verarbeitet, wenn der Benutzer auf einen von ihnen klickt. Ich habe aber auch eine "Alles löschen" -Schaltfläche, die beim Anklicken alle Kontrollkästchen deaktiviert. Wenn der Benutzer auf die Schaltfläche "Alles löschen" klickt, möchte ich nicht, dass die Checkboxen ihr Checked-Ereignis auslösen. Gibt es eine Möglichkeit, dies zu tun?Gibt es eine Möglichkeit zu verhindern, dass eine WPF CheckBox ihr Checked-Ereignis auslöst?

+0

Ich glaube, du meinst unkontrolliertes Ereignis richtig? –

+0

Richtig sorry, das ungeprüfte Ereignis. –

Antwort

4

die Event-Handler zu Beginn des Entfernen im Löschen Sie all Event-Handler der Schaltfläche All Event-Handler der Schaltfläche und dann erneut hinzufügen, die Event-Handler am Ende des Clear.

Hier ist ein schmutziges Beispiel:

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> 

Code hinter

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

Danke, diese Lösung scheint ein bisschen hack-isch, aber ist wahrscheinlich der beste Weg zu gehen. Eine andere praktikable Lösung ist diejenige, die von Jeff zur Verfügung gestellt wird, um eine Variable zu erzeugen, die überprüft wird, um zu sehen, ob sie die "geprüfte" Logik verarbeiten soll. –

1

Es wäre ideal, das Ereignis zu deaktivieren, aber ich weiß nicht, wie das geschehen würde.

Es wäre aber genauso einfach, einen Booleschen Wert hinzuzufügen, um zu verfolgen, ob die Schaltfläche "Alle löschen" gedrückt wurde. Führen Sie dann nur den Deaktivierungscode aus, wenn die Schaltfläche nicht deaktiviert wurde.

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

Dies ist eine praktikable Lösung, aber ich möchte verhindern, dass ich, wenn möglich, eine andere Variable erstellen muss. –

18

Sie können die 'Click' Ereignis verwenden anstelle von 'Karo' oder ‚Nicht markiert ' Veranstaltungen.

Durch Klicken wird sichergestellt, dass die Statusänderung von der Benutzereingabe kommt (z. B. über die Maustaste oder die Leertaste).

Und Operationen wie cb.IsChecked = value werden nicht das Ereignis "Click" auslösen.

+0

Fast vergessen, dass! Es könnte tatsächlich mein Problem lösen, danke! – Enrico

+0

Nur eine Warnung, dies wird nicht ausgelöst, wenn die Leertaste verwendet wird, die auch die Checkbox-Eingabe umschalten kann. –

Verwandte Themen