2016-06-10 2 views
0

У меня есть несколько 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 вне поля зрения?

+0

Где реализована «DataGridHeader_Checked» и «DataGridHeader_Unchecked»? – Xiaoy312

+0

Добавлен относительный код – Jmyster

ответ

0

Я изменил способ, которым он полностью работает, и добавил IsChecked к данным позади. Затем я зациклился на данных и испробовал IsChecked и обновил сетку

Смежные вопросы