2012-02-29 151 views
6

我正在使用WPF数据网格。在数据网格用户中有列标题和行标题。选择所有事件:WPF Datagrid

当列标题和行标题都可见时,在左上角我们有一个可用的小方形部分。 (列和行标题相交的左上角的横截面)。当我们点击它时,它将选择数据网格中的所有单元格。有什么事吗?如果不是如何可以捕捉该事件。请指导我。

如果您需要关于此问题的任何其他信息,请告知我们。

问候, Priyank

回答

12
项目数

datagrid处理路由命令ApplicationCommand.SelectAll,因此如果网格具有焦点并且您按下Ctrl-A,或者您单击了角落按钮,则会选中所有单元格。

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

或者,您可以添加的命令代码绑定: 您可以通过在XAML添加的CommandBinding自己处理这个命令

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

但是,只能有一个路由的单处理器命令,所以默认添加这个处理程序会阻止选择所有在数据网格中工作。 因此,在您的处理程序中,您需要调用SelectAll。

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

这不是一个相当不错的解决方案,但你可以处理一个事件像“的SelectionChanged”,检查所选项目的数量等于在你的数据源

0

我宁愿避免在视图中使用后面的代码,所以我已经做到了这种方式: enter image description here

enter image description here

这是对选择/取消选择所有左上角复选框。

将溶液从2份内置:附加属性和特殊XAML结构:

1)。附加属性:

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>