Это то, что сработало для меня. Я создал новый FTThreeStateCheckBox (подкласс из CheckBox), переопределил метаданные IsCheckedProperty, чтобы я мог наблюдать за изменениями в значении, а затем, если оно было нулевым, я устанавливаю IsThreeState и IsChecked в false.

я есть сетка данных, чей один из столбцов заголовка является флажком трех состояний. Ячейка для этого столбца содержит два флажка состояния + флажок AllItems - 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 >>

Обновлено с исправлением, чтобы закрыть этот пост.

Первым делом я хотел, чтобы «AllItemSelectionCheckBox» имел только два состояния (True, False) при ручном выборе.

private void AllItemSelectionCheckBox_Click(object sender, RoutedEventArgs e)
{
    var cb = e.Source as CheckBox;
    if (!cb.IsChecked.HasValue)
        cb.IsChecked = false;  
}
Я хотел, чтобы флажок «AllItemSelectionCheckBox» отображал код из трех состояний.Все отмеченные флажки приведут к значению TRUEЕсли флажок не установлен, его значение будет FALSE.Любое несколько выбранных приведет к значению 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 не сработало из-за состояния гонки, приводящего к повреждению значения снаружи.

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

Ответы на вопрос(1)

Ваш ответ на вопрос