WPF DataGrid多选功能开发

摘要:
˂DataTemplate.
<DataTemplate x:Key="CheckBoxDataTemplate">
            <Grid x:Name="Grid"  HorizontalAlignment="Center" VerticalAlignment="Center">
                <CheckBox
                    Click="CheckBox_Checked"Uid="{Binding Name}">

                </CheckBox>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger Property="Selector.IsSelected" Value="True">
                    <Setter  TargetName="Grid" Property="Background" Value="White"></Setter>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>

        <Style x:Key="CheckBoxStyle" TargetType="{x:Type DataGridCell}">
            <Setter Property="ContentTemplate" Value="{StaticResource  CheckBoxDataTemplate}"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="#606266" />
                    <Setter Property="Background" Value="White" />
                    <Setter Property="BorderBrush" Value="Transparent"></Setter>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="#f5f7fa" />
                    <!--<Setter Property="Foreground" Value="White"/>-->
                </Trigger>
            </Style.Triggers>
        </Style>

grid checkbox列设置

 <DataGrid  Name="ListGrid" SelectionMode="Extended" VirtualizingStackPanel.IsVirtualizing="False" ItemsSource="{Binding LaryerList}"   Margin="0" AutoGenerateColumns="False" IsReadOnly="True" SelectedIndex="-1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent"  CanUserSortColumns="False" CanUserResizeRows="False" CanUserResizeColumns="False" CanUserReorderColumns="False" DataGridRow.MouseUp="ListGrid_OnMouseUp">
                    <DataGrid.Columns>
                        <DataGridCheckBoxColumn Header="选择" CellStyle="{StaticResource  CheckBoxStyle}">
                            <DataGridCheckBoxColumn.HeaderTemplate>
                                <DataTemplate>
                                    <CheckBox   x:Name="ckbSelectedAll" Uid="-1" Content="全选" Click="CheckBox_Checked" IsChecked="False" />
                                </DataTemplate>
                            </DataGridCheckBoxColumn.HeaderTemplate>
                            
                        </DataGridCheckBoxColumn>
                        <DataGridTextColumn Binding="{Binding itemName}" Header=""  />
                    </DataGrid.Columns>
                </DataGrid>

后台代码实现:

   private void CheckBox_Checked(objectsender, RoutedEventArgs e)
        {
            CheckBox checkBox =(CheckBox)sender;
            var viewModel = (SelectPositionPrintViewModel)this.DataContext;
            if (checkBox.Uid == "-1")
            {
                if (checkBox.IsChecked == true)
                {
                    AllCheckBoxCheck(true);
                    this.ListGrid.SelectAll();

                    viewModel.SelectItemList = ListGrid.SelectedItems.Cast<ItemTreeData>().ToList();
                }
                else{

                    AllCheckBoxCheck(false);
                    this.ListGrid.UnselectAll();
                    viewModel.SelectItemList = ListGrid.SelectedItems.Cast<ItemTreeData>().ToList();
                }
            }
            else{
                var currentItem = (ItemTreeData)this.ListGrid.SelectedItem;

if (checkBox.IsChecked == true)
{
if (!viewModel.SelectItemList.ToList().Exists(c => c.itemName == checkBox.Uid))
{
viewModel.SelectItemList.Add(viewModel.LaryerList.FirstOrDefault(c => c.itemName == checkBox.Uid));
}
}
else
{
viewModel.SelectItemList.RemoveAll(c => c.itemName == checkBox.Uid);

}

}
 private void AllCheckBoxCheck(boolisChecked)
        {
            foreach (var item inListGrid.Items)
            {
                DataGridRow dr =(DataGridRow)ListGrid.ItemContainerGenerator.ContainerFromItem(item);
                VisualHelper.GetVisualChildCheckBox(dr, isChecked);
            }
        }
 public classVisualHelper
    {
        /// <summary>
        ///获取checkBox并设置选中
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="isChecked"></param>
        public static void GetVisualChildCheckBox(DependencyObject parent, boolisChecked)
        {
            int numVisuals =VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                DependencyObject v =(DependencyObject)VisualTreeHelper.GetChild(parent, i);
                CheckBox child = v asCheckBox;

                if (child == null)
                {
                    GetVisualChildCheckBox(v, isChecked);
                }
                else{
                    child.IsChecked =isChecked;
                    return;
                }
            }
        }
    }

免责声明:文章转载自《WPF DataGrid多选功能开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用点云数据在Unity中渲染场景MMKV 多进程K-V组件 SP [MD]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- CacheManager Configuration ========================== An ehcache.xml corresponds to a single CacheManager. See instructions...

easyui中datagrid自带loading效果

1.最近在做项目的时候,数据表格中的列名也是动态,后台会将列名和数据一起返回给前台,这样,easyui中的datagrid中自带的loading效果将不再生效,所以自己写了一个easyui的loading插件(效果和datagrid 效果加载一样)  插件代码如下: // loading_line插件 ;(function($){ 'use str...

WPF中如何为ItemsControl添加ScrollViewer并显示ScrollBar

    今天在开发的过程中突然碰到了一个问题,本来的意图是想当ItemsControl中加载的Item达到一定数量时,会出现ScrollViewer并出现垂直的滚动条,但是实际上并不能够达成目标,对于熟手来说这个问题非常简单,但是如果不了解WPF的模板的原理,可能并不清楚这些,这里举出一个例子来论证。 <Window x: xmln...

WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制

无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。 本文中,我将将尽量避免设置 From 和 To 值,让动画可以随时中断并重新开始,而中...

C# CheckedListBox控件的用法大全

checklistbox控件  1.添加项 checkedListBox1.Items.Add("蓝色"); checkedListBox1.Items.Add("红色"); checkedListBox1.Items.Add("黄色"); 2. 判断第i项是否选中,选中为true,否则为false if(checkedListBox1.GetItemC...

WPF 显示3D密集场景,堆场管理系统

又好久好久没写博客了,这次接着上文https://www.cnblogs.com/CSSZBB/p/12785380.html,上文用WPF 的绘图功能,制作了一个伪3D的2.5D控件ThreeDBox ,那么这玩意我是用来干啥那?没事做做着玩么? 简单来说,这个东西用来显示密集型的操作画面,比如显示一个堆场里集装箱的摆放情况,是不是稍微有点像了那?当然为...