WPF DataGrid实现多选、反选和不选

8 篇文章 0 订阅

本篇文章数据采自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属性【类型不能错】。

效果图:

效果图1
效果图1

方法二:通过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。

效果图:

效果图2
效果图2
效果图3
效果图3

 

下载链接:

百度网盘链接:https://pan.baidu.com/s/1TAf4DBsru0BnyBnXs7zvzg 提取码:rtw1 

      CSDN下载:https://download.csdn.net/download/dear200892/11827368

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值