首页 > 解决方案 > DataGrid取消选择选定的行wpf

问题描述

我正在尝试为 DataGrid 实现多项选择,并且我希望能够通过再次单击它来取消选择行。我这样定义数据网格:


<DataGrid 
                  Style="{StaticResource DefaultDataGrid}" 
                  IsReadOnly="True" 
                  CanUserAddRows="False"
                  AutoGenerateColumns="False"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  SelectionMode="Extended"
                  CurrentCell="{Binding CellInfo, Mode=OneWayToSource}"
                  ItemsSource="{Binding TestCases}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="PreviewMouseDown">
                            <i:InvokeCommandAction Command="{Binding DataGridClickCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <DataGrid.RowStyle>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Background" Value="WhiteSmoke" />
                                </Trigger>
                                <DataTrigger Binding="{Binding IsChecked}" Value="True">
                                    <Setter Property="Background" Value="{StaticResource SelectedCellBackgroundBlueBrush}" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.RowStyle>
                    <DataGrid.Columns>
                        <DataGridCheckBoxColumn Width="40" ElementStyle="{StaticResource DataGridCheckBox}" Binding="{Binding IsChecked}">
                            <DataGridCheckBoxColumn.Header>
                                <CheckBox HorizontalAlignment="Center" Style="{StaticResource DefaultCheckBox}" />
                            </DataGridCheckBoxColumn.Header>
                        </DataGridCheckBoxColumn>
                        <DataGridTextColumn Header="Test Case Id" Binding="{Binding Id}" />
                        <DataGridCheckBoxColumn Width="60" Header="Derived?" Binding="{Binding IsDerived}" ElementStyle="{StaticResource ReadOnlyCheckBox}"/>
                        <DataGridTextColumn Header="Title" Binding="{Binding Title}" />
                        <DataGridTextColumn Header="Parameters File" Binding="{Binding ParameterFile}" />
                        <DataGridTemplateColumn Width="50" Header="Valid">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image HorizontalAlignment="Left" Source="../Icons/ok-icon-green.png" Width="15" Height="15"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn Width="50" Header="Result">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image HorizontalAlignment="Left" Source="../Icons/ok-icon-green.png" Width="15" Height="15" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>

我的 ViewModel 看起来像


        private ICommand _dataGridClickCommand;
        public ICommand DataGridClickCommand
        {
            get
            {
                if (_dataGridClickCommand == null)
                {
                    _dataGridClickCommand = new RelayCommand(() => DataGridClick());
                }

                return _dataGridClickCommand;
            }
        }

        private void DataGridClick()
        {

        }

        private TreeModel _treeModel;
        private CancellationTokenSource _cancellationToken;

        public ObservableCollection<TestTreeData> TestSuites { get; set; }

        public ObservableCollection<TestCaseViewModel> TestCases { get; }

        public ObservableCollection<TestCaseViewModel> SelectedTestCases { get; }

        private DataGridCellInfo _cellInfo;
        public DataGridCellInfo CellInfo
        {
            get => _cellInfo;
            set
            {
                _cellInfo = value;
                OnPropertyChanged("CellInfo");
            }
        }

但我发现,然后您单击已选择的行,未引发 CurrentCell 或 SelectionChanged 事件。我试图在单击数据网格时绑定命令以取消选择选定的行,但是当我看到单击事件后引发的 CurrentCell 事件并且我无法处理单击了哪一行。有人知道怎么做这个吗?谢谢

标签: c#wpfdatagrid

解决方案


要使用 取消选择行SelectionMode="Extended",用户必须使用CTRL + Click

就像提到的@BionicCode 一样,如果您想要不同的行为,您需要创建附加/XAML 行为或使用新功能扩展 DataGrid 控件。这两个选项都不容易做到。

我只会使用默认CTRL + Click行为,因为它是扩展多选的通用 Windows 标准。


推荐阅读