У меня есть несколько DataGrids, где в первом столбце есть флажок, а в заголовке также есть флажок. Как мы все видели, я хочу, чтобы можно было щелкнуть флажок заголовка и выбрать все флажки ниже.WPF DataGrid - Модификация Визуализация из представления прокрутки во время выполнения
<DataGrid x:Name="dgReportTypes_New" Margin="10,140,0,0" Height="175" VerticalAlignment="Top" HorizontalAlignment="Left" Width="216" AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="False" MouseUp="DataGrid_MouseUp" KeyDown="DataGrid_KeyDown">
<DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="True" Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" ClipboardContentBinding="{x:Null}">
<DataGridCheckBoxColumn.HeaderTemplate >
<DataTemplate>
<CheckBox x:Name="chkSelectAll" IsThreeState="True" Checked="DataGridHeader_Checked" Unchecked="DataGridHeader_Unchecked" Indeterminate="DataGridHeader_Indeterminate" />
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding Description}" CanUserResize="False" Width="*" />
</DataGrid.Columns>
</DataGrid>
Проверено
private void DataGridHeader_Checked(object sender, RoutedEventArgs e)
{
DataGrid dg = SGT.Helpers.ControlHelpers.Generics.FindVisualParent<DataGrid>(sender as DependencyObject, typeof(DataGrid));
for (int i = 0; i < dg.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
CheckBox c = ControlHelpers.CheckBoxes.ToggleCheckBox(row, true);
}
e.Handled = true;
}
непроверенных
private void DataGridHeader_Unchecked(object sender, RoutedEventArgs e)
{
DataGrid dg = SGT.Helpers.ControlHelpers.Generics.FindVisualParent<DataGrid>(sender as DependencyObject, typeof(DataGrid));
for (int i = 0; i < dg.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
CheckBox c = ControlHelpers.CheckBoxes.ToggleCheckBox(row, false);
}
e.Handled = true;
}
Неопределенный
private void DataGridHeader_Indeterminate(object sender, RoutedEventArgs e)
{
((CheckBox)sender).IsChecked = false;
e.Handled = true;
}
Переключить
public static CheckBox ToggleCheckBox(DataGridRow row, bool? overrideValue)
{
if (row == null)
{
return null;
}
CheckBox c = Generics.FindVisualChild<CheckBox>(row as DependencyObject, typeof(CheckBox));
if (overrideValue != null)
{
c.IsChecked = overrideValue;
}
else
{
c.IsChecked = !c.IsChecked;
}
return c;
}
public static CheckBox ToggleCheckBox(object sender, MouseButtonEventArgs e, bool? overrideValue)
{
DataGridRow row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow;
if (row == null)
{
return null;
}
CheckBox c = Generics.FindVisualChild<CheckBox>(row as DependencyObject, typeof(CheckBox));
if (overrideValue != null)
{
c.IsChecked = overrideValue;
}
else
{
c.IsChecked = !c.IsChecked;
}
e.Handled = true;
return c;
}
Найти Визуальная
public static T FindVisualChild<T>(DependencyObject parent, Type type) where T : DependencyObject
{
if (parent == null)
Debug.Print("Parent Null");
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child.GetType() == type)
{
Debug.Print(child.ToString());
return child as T;
}
else
{
T result = FindVisualChild<T>(child, type);
if (result != null)
return result;
}
}
return null;
}
DataGrid Нажал
private void DataGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
CheckBox c = ControlHelpers.CheckBoxes.ToggleCheckBox(sender, e, null);
ValidateCheckAll((DataGrid)sender);
}
ручкой Header CheckBox, когда элементы Проверено/бесконтрольно
private void ValidateCheckAll(DataGrid grid)
{
//HeaderedContentControl
DataGridColumnHeadersPresenter hp = Helpers.ControlHelpers.Generics.FindVisualChild<DataGridColumnHeadersPresenter>(grid, typeof(DataGridColumnHeadersPresenter));
CheckBox c = Helpers.ControlHelpers.Generics.FindVisualChild<CheckBox>(hp, typeof(CheckBox));
c.Checked -= new RoutedEventHandler(DataGridHeader_Checked);
c.Unchecked -= new RoutedEventHandler(DataGridHeader_Unchecked);
c.Indeterminate -= new RoutedEventHandler(DataGridHeader_Indeterminate);
int counter = 0;
for (int i = 0; i < grid.Items.Count; i++)
{
DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
//row.Item
if (row != null)
{
CheckBox ch = Helpers.ControlHelpers.Generics.FindVisualChild<CheckBox>(row, typeof(CheckBox));
if (ch.IsChecked == true)
{
counter++;
}
}
Debug.Print(counter.ToString() + " of " + grid.Items.Count.ToString());
}
if (counter == 0)
{
c.IsChecked = false;
}
else if (counter == grid.Items.Count)
{
c.IsChecked = true;
}
else
{
c.IsChecked = null;
}
c.Checked += new RoutedEventHandler(DataGridHeader_Checked);
c.Unchecked += new RoutedEventHandler(DataGridHeader_Unchecked);
c.Indeterminate += new RoutedEventHandler(DataGridHeader_Indeterminate);
}
У меня есть все, что не работает, как я ожидал, пока .. Я попал в DataGrid с прокручиваемыми данными.
ПРОБЛЕМА: Только видимые CheckBoxes изменяются. Я использую визуальные эффекты, чтобы получить флажок и немного понять, почему это происходит.
Вопрос: Есть ли способ изменить остальную часть CheckBoxes вне поля зрения?
Где реализована «DataGridHeader_Checked» и «DataGridHeader_Unchecked»? – Xiaoy312
Добавлен относительный код – Jmyster