c# - 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 事件并且我无法处理单击了哪一行。有人知道怎么做这个吗?谢谢
解决方案
要使用 取消选择行SelectionMode="Extended"
,用户必须使用CTRL + Click
。
就像提到的@BionicCode 一样,如果您想要不同的行为,您需要创建附加/XAML 行为或使用新功能扩展 DataGrid 控件。这两个选项都不容易做到。
我只会使用默认CTRL + Click
行为,因为它是扩展多选的通用 Windows 标准。
推荐阅读
- android - 奇怪的问题-Redmi note4-无法通过adb识别
- list - AttributeError:“列表”对象没有属性“值”
- android - 清单中的 Unity 2018.2 构建错误(资源 drawable/app_icon 未找到)
- html - 如何覆盖特定页面中的 CSS 重要规则
- javascript - 如何对具有相同键的对象值求和并返回一个对象?
- r - 按组嵌套数据框,但在每个组中包含额外的行
- docker - 从两个不同的容器映射端口
- system-verilog - 有没有办法在测试结束时获得断言触发(失败)的次数
- sql - 如何在 BigQuery 中获取两个数组的交集
- java - java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:YEAR