DataGride中的CheckBox的全选与反选操作,该操作仅仅对复选框的选中状态进行了改变与绑定,但没有操作表格中的数据
前台XMAL代码:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApp1" Loaded="getData">
<DataGrid Name="dataGrid" Grid.Row="1" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="选择">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Click="CheckBox_Click_3" Name="heaChe"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox VerticalAlignment="Center" Loaded="CheckBox_Loaded_1" Click="CheckBox_Click_1" HorizontalAlignment="Center"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>
后台:
给DataGride 表格设置itemSource值
private void getData(object sender, RoutedEventArgs e)
{
List<int> ids = new List<int>();
ids.Add(1);
ids.Add(3);
ids.Add(4);
ids.Add(5);
ids.Add(6);
ids.Add(7);
dataGrid.ItemsSource = ids;
}
首先为了方便操作把checkBox控件先放到内存中缓存下来
List<CheckBox> headerChecks = new List<CheckBox>();
private void CheckBox_Loaded_1(object sender, RoutedEventArgs e)
{
CheckBox cbtemp = (CheckBox)sender;
headerChecks.Add(cbtemp);
}
全选复选框的点击事件
private void CheckBox_Click_3(object sender, RoutedEventArgs e)
{
CheckBox chb = GetVisualChild<CheckBox>(dataGrid, v => v.Name == "heaChe");
if (chb.IsChecked == true)
{
//chb.IsChecked = false;
headerChecks.ForEach(a => a.IsChecked = true);
}
else
{
//chb.IsChecked = false;
headerChecks.ForEach(a => a.IsChecked = false);
}
}
/// <summary>
/// 泛型方法,从VisualTree一层层地查找并定位到给定名称(CheckBox)的元素
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parent"></param>
/// <param name="predicate"></param>
/// <returns></returns>
public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) where T : Visual
{
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
T child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v, predicate);
if (child != null)
{
return child;
}
}
else
{
if (predicate(child))
{
return child;
}
}
}
return null;
}