概述
GridControl控件使用我们已经进行了实例讲解,这节内容我们列举一个特殊的应用场景:表格中有一列CheckBox,默认都处于勾选状态,当用户通过界面操作后,我们要确保用户至少选择了一项,相当于一次数据验证,这个怎么做呢?这里其实有个问题是,你每个checkbox的选中与取消选中,我们可以通过属性的set属性获知,但是难点在于我们每次操作的对象只是集合的一个实例,我们要知道集合中其它实例的状态就需要一些特殊的操作,可能比较绕,我们先看运行结果。
运行结果
源代码
前台:
<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;
}
}
}
}
这里我们增加了一个静态的字典,每次将我们当前是否选中的一个状态存起来,这样每次前台界面进行操作以后,我们就可以通过字典中的信息去进行判断目前是否至少有一个人员信息被选中了.感觉方法不够丝滑,如有更好的方法实现这个需求,麻烦给小编留言!