本篇文章数据采自https://mp.csdn.net/postedit/78849632,本篇就不在重复了。
WPF 要实现DataGrid checkbox全选和反选,方法有几种:
方法一:更改XAML代码
<Window.Resources>
<local:ImagesConverter x:Key="converter"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="MainGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="50">
<DataGridTemplateColumn.Header>
<CheckBox x:Name="cb_parent" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="cb_child" IsChecked="{Binding ElementName=cb_parent,Path=IsChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="书籍名称" Width="60" IsReadOnly="True" Binding="{Binding BookName}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<TextBlock Text="封面" Width="70"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Width="70" Height="70" Source="{Binding BookCover,Converter={StaticResource converter}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="分类" Width="50" IsReadOnly="True" Binding="{Binding BookType}"/>
<DataGridTextColumn Header="价格" Width="50" IsReadOnly="True" Binding="{Binding BookPrice}"/>
<DataGridTextColumn Header="库存" Width="50" IsReadOnly="True" Binding="{Binding BookStock}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
关键内容: <CheckBox x:Name="cb_child" IsChecked="{Binding ElementName=cb_parent,Path=IsChecked}"/>
意思就是,绑定另一个Y控件,此控件的X属性等于Y控件的Z属性【类型不能错】。
效果图:

方法二:通过INotifyPropertyChanged接口,实现全选、反选和不选
XAML:
<Window.Resources>
<local:ImagesConverter x:Key="converter"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="MainGrid" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="80">
<DataGridTemplateColumn.Header>
<ComboBox x:Name="cbx" Width="71" SelectionChanged="Cbx_SelectionChanged">
<ComboBoxItem>全选</ComboBoxItem>
<ComboBoxItem>反选</ComboBoxItem>
<ComboBoxItem>不选</ComboBoxItem>
</ComboBox>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="cb_child" IsChecked="{Binding DataContext.IsCheck,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGridRow}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="书籍名称" Width="60" IsReadOnly="True" Binding="{Binding BookName}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<TextBlock Text="封面" Width="70"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Width="70" Height="70" Source="{Binding BookCover,Converter={StaticResource converter}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="分类" Width="50" IsReadOnly="True" Binding="{Binding BookType}"/>
<DataGridTextColumn Header="价格" Width="50" IsReadOnly="True" Binding="{Binding BookPrice}"/>
<DataGridTextColumn Header="库存" Width="50" IsReadOnly="True" Binding="{Binding BookStock}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
cs:
/// <summary>
/// 全选?反选?不选
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Cbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((ComboBoxItem)cbx.SelectedItem == null)
{
return;
}
string text = ((ComboBoxItem)cbx.SelectedItem).Content.ToString();
foreach (Book book in MainGrid.Items)
{
if (text == "全选")
{
book.IsCheck = true;
}
else if (text == "反选")
{
book.IsCheck = !book.IsCheck;
}
else if (text == "不选")
{
book.IsCheck = false;
}
}
this.cbx.SelectedIndex = -1;
}
这里有个疑问:如果不添加【IsChecked="{Binding DataContext.IsCheck,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGridRow}}"】,仅仅只是【IsChecked="{Binding IsCheck}"】,你勾选中后并没有更新后台数据源,依旧是false。
效果图:


下载链接:
百度网盘链接:https://pan.baidu.com/s/1TAf4DBsru0BnyBnXs7zvzg 提取码:rtw1
CSDN下载:https://download.csdn.net/download/dear200892/11827368