C# WPF 表格控件的前后台数据交互?

概述

  GridControl控件使用我们已经进行了实例讲解,这节内容我们列举一个特殊的应用场景:表格中有一列CheckBox,默认都处于勾选状态,当用户通过界面操作后,我们要确保用户至少选择了一项,相当于一次数据验证,这个怎么做呢?这里其实有个问题是,你每个checkbox的选中与取消选中,我们可以通过属性的set属性获知,但是难点在于我们每次操作的对象只是集合的一个实例,我们要知道集合中其它实例的状态就需要一些特殊的操作,可能比较绕,我们先看运行结果。

运行结果

684176db2fede8acd1e5001c8b16206b.gif

源代码

前台:

<StackPanel>
        <Label Content="this is a tab control page" Margin="5"/>
        <dxg:GridControl ItemsSource="{Binding GridParamItems}" MaxHeight="400">
            <dxg:GridColumn Header="姓名" FieldName="Name" Width="80" />
            <dxg:GridColumn Header="选择" FieldName="IsChecked" Width="80" />
            <dxg:GridColumn Header="选择" Width="80" >
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding RowData.Row.IsChecked}"
                            HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
            </dxg:GridColumn>
        </dxg:GridControl>
    </StackPanel>

这里没啥新的内容,和上节一样,不清楚的看上一篇内容;

后台代码:

using PropertyChanged;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;


namespace Caliburn.Micro.Hello
{
    [AddINotifyPropertyChangedInterface]
    public class SubTabPageViewModel
    {
        public ObservableCollection<GridParamDTO> GridParamItems { get; set; } = new ObservableCollection<GridParamDTO>();


        public SubTabPageViewModel()
        {
            GridParamItems.Add(new GridParamDTO() { Name = "张三", IsChecked = true });
            GridParamItems.Add(new GridParamDTO() { Name = "李四", IsChecked = true });
        }
    }


    public class GridParamDTO
    {
        public string Name { get; set; }


        private bool isChecked;
        public bool IsChecked 
        { 
            get
            {
                return isChecked;
            }
            set
            {
                try
                {
                    if (!value)
                    {
                        var keyValue = Name;
                        if (IsCheckedDic.Count == 2)
                        {
                            keyValue = IsCheckedDic.Keys.Where(k => k != Name).ToList()[0];
                        }




                        if (IsCheckedDic.Count == 1
                            || IsCheckedDic.Count == 2 && !IsCheckedDic[keyValue])
                        {
                            MessageBox.Show("至少得勾选一个人");
                            if (!IsCheckedDic.Keys.Contains(Name))
                            {
                                IsCheckedDic.Add(Name, isChecked);
                            }
                            else
                            {
                                IsCheckedDic[Name] = isChecked;
                            }
                            return;
                        }
                    }


       
                    isChecked = value;
                    if (!IsCheckedDic.Keys.Contains(Name))
                    {
                        IsCheckedDic.Add(Name, isChecked);
                    }
                    else
                    {
                        IsCheckedDic[Name] = isChecked;
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show($"{ex}");
                }
            }
        }




        public static Dictionary<string,bool> isCheckedDic;
        public static Dictionary<string, bool> IsCheckedDic
        { 
            get
            {
                if(isCheckedDic == null)
                {
                    isCheckedDic = new Dictionary<string, bool>();
                }
                return isCheckedDic;
            }
            set
            {
                isCheckedDic = value;
            }
        } 
    }
}

这里我们增加了一个静态的字典,每次将我们当前是否选中的一个状态存起来,这样每次前台界面进行操作以后,我们就可以通过字典中的信息去进行判断目前是否至少有一个人员信息被选中了.感觉方法不够丝滑,如有更好的方法实现这个需求,麻烦给小编留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值