2012-02-29 50 views
6

Tôi đang sử dụng lưới dữ liệu WPF. Trong người dùng lưới dữ liệu có các tiêu đề cột và hàng tiêu đề.Sự kiện cho Chọn tất cả: Bảng dữ liệu WPF

Khi các tiêu đề cột và hàng tiêu đề đều hiển thị, ở góc trên cùng bên trái, chúng tôi có sẵn một phần hình vuông nhỏ. (mặt cắt ngang ở góc trên bên trái, nơi các tiêu đề cột và hàng đáp ứng.) khi chúng ta nhấp vào nó sẽ chọn tất cả các ô trong lưới dữ liệu. Có sự kiện nào không? Nếu không làm thế nào có thể bẫy sự kiện đó. Xin vui lòng hướng dẫn cho tôi.

Hãy cho tôi biết nếu bạn cần bất kỳ thông tin nào khác về vấn đề này.

Kính trọng, Priyank

Trả lời

12

DataGrid xử lý lệnh được định tuyến ApplicationCommand.SelectAll, vì vậy nếu lưới có tiêu điểm và nhấn Ctrl-A, hoặc bạn bấm vào nút góc, tất cả các ô được chọn. Bạn có thể xử lý lệnh này cho mình bằng cách thêm một CommandBinding trong XAML:

<DataGrid x:Name="dataGrid" .../> 
    <DataGrid.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.SelectAll" Executed="SelectAll_Executed"/> 
    </DataGrid.CommandBindings> 

Hoặc bạn có thể thêm các lệnh ràng buộc trong mã:

public MyControl(){ 
    InitializeComponent(); 
    ... 
    dataGrid.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAll_Executed)); 
} 

Tuy nhiên, chỉ có thể có một handler duy nhất cho một chuyển lệnh, do đó, theo mặc định thêm trình xử lý này, điều này sẽ ngăn không cho chọn tất cả làm việc trong DataGrid. Trong trình xử lý, bạn cần gọi SelectAll.

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    Debug.WriteLine("Executed"); 
    dataGrid.SelectAll(); 
} 
0

Nó không phải là khá một giải pháp tốt đẹp, nhưng bạn có thể xử lý một sự kiện như "SelectionChanged" và kiểm tra nếu số lượng các mục đã chọn bằng số lượng các mục trong nguồn dữ liệu của bạn

0

tôi thích để tránh sử dụng một mã số phía sau trong quan điểm, vì vậy tôi đã thực hiện nó theo cách này: enter image description here

enter image description here

Đó là CheckBox trên góc phía trên bên trái đó chọn/bỏ chọn tất cả .

Các giải pháp được xây dựng từ 2 phần: tài sản gắn liền và cơ cấu XAML đặc biệt:

1). tài sản gắn liền:

public class DataGridSelectAllBehavior 
{ 
    public static bool GetValue(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(ValueProperty); 
    } 

    public static void SetValue(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ValueProperty, value); 
    } 
    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.RegisterAttached("Value", typeof(bool), typeof(DataGridSelectAllBehavior), new PropertyMetadata(false, 
      (o, e) => 
      { 
       var dg = DataGridSelectAllBehavior.GetDataGrid(o); 
       CheckBox checkBox = o as CheckBox; 

       if (checkBox.IsChecked == true) 
       { 
        dg.SelectAll(); 
       } 
       else 
       { 
        dg.UnselectAll(); 
       } 

      })); 


    public static DataGrid GetDataGrid(DependencyObject obj) 
    { 
     return (DataGrid)obj.GetValue(DataGridProperty); 
    } 

    public static void SetDataGrid(DependencyObject obj, DataGrid value) 
    { 
     obj.SetValue(DataGridProperty, value); 
    } 

    public static readonly DependencyProperty DataGridProperty = 
     DependencyProperty.RegisterAttached("DataGrid", typeof(DataGrid), typeof(DataGridSelectAllBehavior), new PropertyMetadata(null)); 

} 

2) XAML:

<DataGrid ItemsSource="{Binding PendingChanges}" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      SelectionMode="Extended"> 
    <i:Interaction.Behaviors> 
     <behaviors:MultiSelectGridSelectedItemsBehavior SelectedItems="{Binding SelectedPendingChanges, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
    </i:Interaction.Behaviors> 
    <DataGrid.Columns> 
     <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}}"> 
      <DataGridCheckBoxColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox 
           behaviors:DataGridSelectAllBehavior.Value="{Binding IsChecked,RelativeSource={RelativeSource Self}}" 
           behaviors:DataGridSelectAllBehavior.DataGrid="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/> 
       </DataTemplate> 
      </DataGridCheckBoxColumn.HeaderTemplate> 
     </DataGridCheckBoxColumn> 
     <DataGridTextColumn Header="Name" 
          Width="Auto" 
          Binding="{Binding Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="State" 
          Width="Auto" 
          Binding="{Binding State, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Folder" 
          Width="*" 
          Binding="{Binding ParentFolderPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataGrid.Columns> 
</DataGrid> 
Các vấn đề liên quan