2010-07-22 24 views
6

Tôi có một nhóm Hộp kiểm WPF có trình xử lý sự kiện được kiểm tra xử lý một số logic khi người dùng nhấp vào một trong số đó. Tuy nhiên, tôi cũng có nút "Xóa tất cả", khi được nhấp, sẽ xóa tất cả các hộp kiểm. Nếu người dùng nhấp vào nút "Xóa tất cả", tôi KHÔNG muốn các hộp kiểm kích hoạt sự kiện Đã kiểm tra của họ. Có cách nào để làm điều này?Có cách nào để ngăn Hộp kiểm WPF kích hoạt sự kiện Đã kiểm tra của nó không?

+0

Tôi tin rằng bạn có nghĩa là sự kiện không được chọn phải không? –

+0

Xin lỗi, sự kiện không được chọn. –

Trả lời

4

Xóa trình xử lý sự kiện ở đầu trình xử lý sự kiện của nút Xóa tất cả và sau đó thêm trình xử lý sự kiện vào cuối trình xử lý sự kiện của nút Xóa tất cả.

Đây là một mẫu bẩn:

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> 

Mã Đằng sau

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

Cảm ơn, giải pháp này có vẻ hơi hack-ish nhưng có lẽ là cách tốt nhất để đi. Một giải pháp khả thi khác là giải pháp do Jeff cung cấp, để tạo một biến được kiểm tra để xem liệu nó có nên xử lý logic 'Đã kiểm tra' hay không. –

1

Sẽ là lý tưởng để vô hiệu hóa sự kiện nhưng tôi không biết điều đó sẽ được thực hiện như thế nào.

Mặc dù sẽ dễ dàng thêm một boolean để theo dõi xem nút "Xóa tất cả" đã được nhấn hay chưa. Sau đó, chỉ thực hiện kiểm tra mã nếu nó không được kiểm soát thông qua nút.

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

Đây là giải pháp khả thi, nhưng tôi muốn ngăn chặn việc phải tạo một biến khác nếu có thể. –

18

Bạn có thể sử dụng các sự kiện 'Nhấp vào' thay vì 'Kiểm tra' hoặc 'không được kiểm soát ' sự kiện.

'Nhấp' sẽ đảm bảo rằng thay đổi trạng thái sẽ đến từ đầu vào của người dùng (thông qua nút chuột hoặc thanh không gian chẳng hạn).

Và các hoạt động như cb.IsChecked = value sẽ không kích hoạt sự kiện 'Nhấp'.

+0

Hầu như quên điều đó! Nó thực sự có thể giải quyết vấn đề của tôi, cảm ơn! – Enrico

+0

Chỉ là cảnh báo, Điều này không kích hoạt nếu thanh dấu cách được sử dụng cũng có thể chuyển đổi đầu vào hộp kiểm. –

Các vấn đề liên quan