Datagrid列标题应根据DataGridView列中的所有复选框是选中还是未选中来检查/取消选中复选框的状态。

10

图片描述 我遇到的问题与 DataGrid(WPF)中的复选框有关。 为更好地理解问题,我已附上了截图。

问题:即使其中一个子项未选中,数据头列复选框仍然被选中。 我希望解决方案可以修复此问题,以便当用户明确取消选中其中一个子项时,“全部”(列标题)应隐含取消选中。

请帮帮忙... 谢谢 请查看链接。 我希望解决方案能像这样工作。http://www.codeproject.com/Articles/42437/Toggling-the-States-of-all-CheckBoxes-Inside-a-Dat#

<dg:DataGrid.Columns>
    <dg:DataGridCheckBoxColumn Binding="{Binding Check}" IsThreeState="True" Width="50">
        <dg:DataGridCheckBoxColumn.HeaderTemplate>
            <DataTemplate x:Name="dtAllChkBx">
                <CheckBox Name="cbxAll" Content="{x:Static properties:Resources.lblAll}"
                          Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
            </DataTemplate>
        </dg:DataGridCheckBoxColumn.HeaderTemplate>
    </dg:DataGridCheckBoxColumn>

.

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    unchck_all_prd();
    dgEnggAcc.Items.Refresh();
}

private void unchck_all_prd()
{
    for (int i = 0; i < engg_list.Count; i++)
    {
        engg_list[i].Check = false;
    }
}

private void chck_all_prd()
{
    for (int i = 0; i < engg_list.Count; i++)
    {
        engg_list[i].Check = true;
    }
}

public class EnggLst : ObservableCollection<EnggLst>
{
    public bool Check { get; set; }
}
2个回答

3
//this event is for **Checked and UnChecked** of up check box (cbxall)
private void UpCheckbox_Checked(object sender, RoutedEventArgs e)
{
    //checkBox1 = cbxall (your up checkbox)
    if (checkBox1.IsChecked == true)
    {
        dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = true);
    }
    else
    {
        dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = false);
    }
}

//this event is for all other check box
//**Checked and UnChecked** of all other check box is this event
private void OtherCheckbox_Checked(object sender, RoutedEventArgs e)
{
    //checkBox1 = cbxall (your up checkbox)
    if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == true))
    {
        checkBox1.IsChecked = true;
    }
    else if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == false))
    {
        checkBox1.IsChecked = false;
    }
    else
    {
        checkBox1.IsChecked = null;
    }
}

IsChecked 是一个可空布尔值,因此您必须使用 ckbox.IsChecked == true 明确检查其值,或者用 ckbox.IsChecked ?? false 进行合并。 - MissingL_tter

0
在你的 XAML 数据表格中添加:
<DataGridTemplateColumn.Header>
<CheckBox x:Name="ckbHeader" Click="ckbHeader_Click"></CheckBox>
</DataGridTemplateColumn.Header>

在你的代码中添加:
var ckbox = sender as CheckBox;
var All = Collection.View.SourceCollection as List<ObjectX>;

if (ckbox.IsChecked)
{
    foreach (var item in All)       
        item.Marked = true;     
}
else
{
    foreach (var item in All)       
        item.Marked = false;        
}
Collection.View.Refresh();

注意:发送者是复选框


检查是否等于“true”是多余的。只需说“if (ckbox.IsChecked)”即可。 - Robert Harvey
1
不,对于 CheckBox 类型,属性 IsChecked 可能为 null,因此需要明确指定 true、false 或 null。尝试实际情况。 - Darlan Dieterich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接