主要使用的是DataGridCheckBoxColumn,能够自动为所有行添加勾选框,随后我们在设置勾选框的绑定Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}" 即可
具体代码如下:
<DataGrid.Columns>
<DataGridCheckBoxColumn CanUserResize="False" Width="auto" Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}"/>
</DataGrid.Columns>
后来发现这样写有局限性:就是只能单选,触发不了我写的多选附加属性类,所以我又改为如下方式实现代码:
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected,RelativeSource=
{RelativeSource AncestorType=DataGridRow}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
这样就能实现想单选时点击行内容部分,想多选时勾选前面的复选框.
如果发现没有多选可以尝试设置SelectionMode="Extended" SelectionUnit="FullRow"
如果发现添加的勾选框列没有显示可以设置HeadersVisibility="All"
如果想要更改表格左上角的这个样式
可以在datagrid的默认样式中找到这一条
这个button就对应表格最左上角这一块,改变这里的样式即可。
---------------------------------------------------------------------------------------------------------------------------------
6月7日更新:
采用上面这种方法有个缺陷就是不容易实现全选/不选功能,因为其datagrid自带的只有DataGrid.SelectAllCommand命令,即只能全选,再点击也不能取消全选。而我的样式统一都写在资源文件里,也不容易再定义命令,所以我又换了一种实现方式。
<DataGrid.Columns>
<!--复选框列-->
<DataGridCheckBoxColumn CanUserResize="False" Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}">
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Checked="chkSelectAll_Checked" Unchecked="chkSelectAll_Unchecked"/>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
<!--不重写cell样式也自带有checkbox,但好像不能多选-->
<DataGridCheckBoxColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<!--添加preview事件是因为checkbox在template中,必须双击才能选中,所以添加事件避免这种情况-->
<CheckBox x:Name="check" PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" VerticalAlignment="Center" IsChecked="{Binding IsSelected,Mode=TwoWay,RelativeSource={RelativeSource AncestorType=DataGridRow}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn>
<DataGrid.Columns>
其中后台事件如下:
private void chkSelectAll_Checked(object sender, RoutedEventArgs e)
{
DataGrid.SelectAll();
}
private void chkSelectAll_Unchecked(object sender, RoutedEventArgs e)
{
DataGrid.UnselectAll();
}
private void CheckBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
var checkBox = sender as CheckBox;
if (checkBox != null) {
checkBox.IsChecked = !checkBox.IsChecked;
}
}