【问题标题】:DataGrid unselect selected row wpfDataGrid取消选择选定的行wpf
【发布时间】:2020-12-14 05:42:25
【问题描述】:

我正在尝试为 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 事件并且我无法处理单击了哪一行。 有人知道怎么做这个吗? 谢谢

【问题讨论】:

  • 您想要的已经是DataGrid 的一个功能。无论如何,这是视图逻辑,不属于视图模型。在代码隐藏中处理事件或创建行为或扩展 DataGrid 类。

标签: c# wpf datagrid


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2013-03-31
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    相关资源
    最近更新 更多