Событие для выбора всех: WPF Datagrid - PullRequest
7 голосов
/ 29 февраля 2012

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 29 февраля 2012

Сетка данных обрабатывает перенаправленную команду 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();
}
0 голосов
/ 07 июля 2016

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

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

...