在WPF中DataGrid和CheckBox的联合使用是非常常见的,但是在DataGrid中怎
么实现全选和部分选择的功能并没有现成的控件去使用。要想实现该功能,必须人工通
过代码来完成。关于实现的方式,网上有很多,有的很简单有的比较复杂。现参考了网
上大牛的代码又结合了自己目前的项目自己手工写了一个实现全选和单选的控件。罗列
如下:
前台代码:主要是在DataGrid中添加一列CheckBox,另外通过双向绑定的方式实现
随着前后台的一致。
<DataGridTemplateColumn Header="全è?选?">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox x:Name="CheckAll" Click="CheckAll_Click" IsChecked="{Binding IsAllChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="itemCheck" IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="IsCheckAll_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
后台:
private void IsCheckAll_Click(object sender, RoutedEventArgs e)
{
switch (tabDBF.SelectedIndex)
{
case 0: //基ù表±í
var dfJB = FindChild<CheckBox>(dgJB, "CheckAll");
int _count = dgJB.Items.Cast<JBClass>().Where(t => t.IsChecked).Count();
int total = dgJB.Items.Count;
if (_count == total)
{
dfJB.IsChecked = true;
isAllCheckedJB = false;
}
else
{
dfJB.IsChecked = false;
isAllCheckedJB = true;
}
break;
case 1: //综×?表±í
var dfZB = FindChild<CheckBox>(dgZB, "CheckAll");
int _countZB = dgZB.Items.Cast<ZBClass>().Where(t => t.IsChecked).Count();
int totalZB = dgZB.Items.Count;
if (_countZB == totalZB)
{
dfZB.IsChecked = true;
isAllCheckedZB = false;
}
else
{
dfZB.IsChecked = false;
isAllCheckedZB = true;
}
break;
case 2: //分·?析?表±í
var dfFXB = FindChild<CheckBox>(dgFXB, "CheckAll");
int _countFXB = dgFXB.Items.Cast<FXBClass>().Where(t => t.IsChecked).Count();
int totalFXB = dgFXB.Items.Count;
if (_countFXB == totalFXB)
{
dfFXB.IsChecked = true;
isAllCheckedFXB = false;
}
else
{
dfFXB.IsChecked = false;
isAllCheckedFXB = true;
}
break;
case 3: //过1y录?表±í
var dfGLB = FindChild<CheckBox>(dgGLB, "CheckAll");
int _countGLB = dgGLB.Items.Cast<GLBClass>().Where(t => t.IsChecked).Count();
int totalGLB = dgGLB.Items.Count;
if (_countGLB == totalGLB)
{
dfGLB.IsChecked = true;
isAllCheckedGLB = false;
}
else
{
dfGLB.IsChecked = false;
isAllCheckedGLB = true;
}
break;
case 4: //代′ú码?表±í
var dfDMB = FindChild<CheckBox>(dgDMB, "CheckAll");
int _countDMB = dgDMB.Items.Cast<DMBClass>().Where(t => t.IsChecked).Count();
int totalDMB = dgDMB.Items.Count;
if (_countDMB == totalDMB)
{
dfDMB.IsChecked = true;
isAllCheckedGLB = false;
}
else
{
dfDMB.IsChecked = false;
isAllCheckedDMB = true;
}
break;
}
//_DbfsjdcViewModel_2015.IsAllChecked = true;
}
总结:该实例主要通过判断DataGrid中已选择的行数和总行数的比较来实现的
,方式比较简单,但是基本上可以实现目标要求的。在此仅作记录,以方便自己后续的
学习。如有更好的实现方案,还望各位大神不吝赐教。