Как установить / сбросить значение флажка с тремя состояниями в WPF

У меня есть сетка данных, в одном из столбцов заголовка которой установлен флажок с тремя состояниями. Шаблон ячейки для этого столбца содержит флажки с двумя состояниями + AllItems CheckBox - Item1 - Item2 - Item3 .. Я хотел использовать флажок AllItems для выбора / отмены выбора всех элементов (item1, item2), который отлично работает. Затем я хотел установить флажок AllItems в промежуточное состояние, когда не все элементы выбраны / не выбраны. Точно так же я хотел установить флажок AllItems как отмеченный / не отмеченный, когда все элементы выбираются вручную.

Вот код, который я пробовал ...

<dg:DataGridTemplateColumn.HeaderTemplate>
    <DataTemplate>
        <StackPanel x:Name="StackPanelForItemCheckbox" Orientation="Horizontal">
           <CheckBox x:Name="AllItemSelectionCheckBox" HorizontalAlignment="Left" Cursor="Hand"  
                     IsChecked="{Binding IsAllItemChecked, Mode=TwoWay}"                                              
                     IsThreeState="True"  Checked="ItemSelectionCheckBox_Checked" 
                     Unchecked="ItemSelectionCheckBox_Unchecked"
                     Click="AllItemSelectionCheckBox_Click">
           <TextBlock x:Name="ItemNameTextBlock" Text="Item" Margin="10,0,0,0">
           ......
<dg:DataGridTemplateColumn.CellTemplate>
       <DataTemplate x:Name="ItemCheckDataTemplate">                                
           <StackPanel x:Name="ItemCheckBoxStackPanel" Orientation="Horizontal">                                    
                  <CheckBox x:Name="itemCheckBox" Cursor="Hand" IsChecked="{Binding IsItemChecked, Mode=TwoWay}" Click="ItemSelectionCheckBox_Click"></CheckBox>
                   <TextBlock x:Name="ItemNameTextBlock" Text="{Binding Path=Item}"> </TextBlock>                                   
            </StackPanel>
         </DataTemplate>
...

Метод «ItemSelectionCheckBox_Click» ищет все три состояния (все проверено, не проверено, промежуточное) и устанавливает свойство «IsAllItemChecked», равное INotifyproperty. Это не работает. Другой вариант, который я могу попробовать, - это найти элемент AllItems и установить его из кода. Ничего подобного в сети найти не удалось. Есть несколько примеров, но для TreeView, а не для того, что я пытаюсь. Есть помощь?

PS >>

Обновлено с исправлением, чтобы закрыть этот пост. { var cb = e.Source as CheckBox; если (! cb.IsChecked.HasValue) cb.IsChecked = false; }
  • Я хотел, чтобы флажок AllItemSelectionCheckBox отображал трехступенчатый сквозной код.
  • Все отмеченные флажки приведут к значению ИСТИНА
  • Если все флажки сняты, их значение будет равно ЛОЖЬ
  • Любое несколько selected приведет к его значению NULL.
  • Пример кода следующий:

    private void itemCheckBox_Checked(object sender, RoutedEventArgs e)
    { 
        DataGridRowsPresenter DGRPresenter = FindVisualChild<DataGridRowsPresenter>(DataGName1);
        if (DGRP == null || DGRP.Children == null)
            return null;
        foreach (object obj in UIEC)
        {
            DGR = obj as Microsoft.Windows.Controls.DataGridRow;
            UIC = DGR.Item as <datagrid mapped data model>;
            if (DGR.IsSelected == true)
                UIC.IsItemChecked = true;
            if (UIC.IsItemChecked == true)
                    NumberOfItemsChecked++;
        }
        if (NumberOfItemsChecked == myViewModelAllItems.Count)
        {
            allcheckbox.IsChecked = true;
        }
        else if (NumberOfItemsChecked < myViewModelAllItems.Count)
        {
            allcheckbox.IsChecked = null;   //intermittent state
        }
    }
    

    Глобальное обновление счетчика NumberOfItemsChecked не работает из-за состояния гонки, искажающего значение снаружи.

    Примечание: Приведенный выше код больше похож на пример и может не работать при его прямом копировании. Я могу предоставить полный код с образцом по запросу.

    6
    задан sebingel 14 August 2018 в 11:52
    поделиться