Событие для Select All: WPF Datagrid

Я использую сетку данных WPF. В data-grid у пользователя есть заголовки столбцов и заголовки строк.

когда заголовки столбцов и строк видны, в верхнем левом углу у нас есть один небольшой квадратный раздел. (поперечное сечение в верхнем левом углу, где встречаются заголовки столбцов и строк.) когда мы нажимаем на это, он выбирает все ячейки в пределах сетки данных. Для этого есть какое-нибудь мероприятие? Если нет, как можно поймать это событие. Пожалуйста, веди меня.

дайте мне знать, если вам нужна любая другая информация, касающаяся этой проблемы.

с уважением, Priyank

3 ответов


datagrid обрабатывает маршрутизируемую команду ApplicationCommand.SelectAll, так что если сетка имеет фокус и нажмите Ctrl-A, или нажмите кнопку угол, все ячейки будут выбраны. Вы можете обработать эту команду самостоятельно, добавив CommandBinding в xaml:

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

или вы можете добавить привязку команды в коде:

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

однако для маршрутизируемой команды может быть только один обработчик, поэтому по умолчанию добавление этого обработчика предотвратит работу select all в датагриде. Поэтому в вашем обработчике вам нужно вызвать SelectAll.

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

Это не совсем хорошее решение, но вы можете обработать такое событие, как "SelectionChanged", и проверить, равно ли количество выбранных элементов количеству элементов в вашем источнике данных


Я предпочитаю избегать использования кода в представлениях, поэтому я сделал это таким образом: 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>