检查DataGrid中的CheckBox应该检查RowDetails中的所有复选框

时间:2012-06-18 10:59:27

标签: c# wpf datagrid

我有一个DataGrid货件和产品。始终显示货件,每个货件的产品都显示在RowDetails中,当我双击一行时,这些产品变得可见。

在DataGrid中,我使用的是自定义复选框列:

<DataGridTemplateColumn>
   <DataGridTemplateColumn.Header>
       Copy
   </DataGridTemplateColumn.Header>
   <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <CheckBox IsChecked="{Binding Path=DoCopy, Mode=TwoWay, 
             UpdateSourceTrigger=PropertyChanged}"
       </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我的<DataGrid.RowDetailsTemplate>具有相同的列。 我正在寻找的是,当选中“主要”复选框时,检查详细信息视图中的所有项目。

我有一个Shipment类和一个Product类。这两个类都具有DoCopy属性。 装运:

Run through all products and set DoCopy = true

问题:

当我单击DataGrid中的复选框时,将检查所有产品的复选框。但只有在没有显示RowDetails的情况下。如果显示RowDetails并单击“main”复选框,则会检查它,但是详细信息复选框没有。

此外,如果我之前打开并关闭了行详细信息,然后选中“主”复选框,则会发生同样的情况。产品的复选框仍未选中。

货件有List<Product>,其中包含该货件的所有产品。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

以下代码适用于我。我只想在某个事件上选择数据网格的所有复选框。以下代码只检查了datagrid中的所有复选框。在我的情况下,列零是一个复选框列

private void SelectAll()
    {
        for (int i = 0; i < dgVehicle.Items.Count; i++)
        {
            DataGridRow row = (DataGridRow)dgVehicle.ItemContainerGenerator.ContainerFromIndex(i);

            if (row != null)
            {
                CheckBox chk = dgVehicle.Columns[0].GetCellContent(row) as CheckBox;
                chk.IsChecked = true;
            }
        }
    } 

答案 1 :(得分:0)

thakrage, 处理此问题的最简单方法是,对每个“复制”复选框行使用点击事件,在这种情况下,您可以设置Docopy = true或您想要做的Watever ...

然后在数据网格外部定义一个复选框,然后设置边距,使复选框与数据标题完全相同,并冒泡点击事件以检查所有行。

请参阅下面的示例代码:

<CheckBox Name="chkbox_chkall" Click="chkbox_chkall_Click" Content="Check all" BorderBrush="#FF828282" Foreground="#FF5B585A"/>

<DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
       <CheckBox IsChecked="{Binding Path=DoCopy, Mode=TwoWay, 
         UpdateSourceTrigger=PropertyChanged}" Click="chkBoxRow_Click"
   </DataTemplate>

CodeBehind中的

    private void chkbox_chkall_Click(object sender, RoutedEventArgs e)
    {
        CheckBox chkbox_chkall = sender as CheckBox;
        foreach (OnlineActivatedProducts rowItem in (grdProducts.ItemsSource))
        {
            CheckBox chk = grdProducts.Columns[6].GetCellContent(rowItem) as CheckBox;
            if (chkbox_chkall.IsChecked == true)
            {
                chk.IsChecked = true;
            }
            else
            {
                chk.IsChecked = false;
            }
            chkBoxRow_Click(chk, e); // which bubbles each rows checked / unchecked event
        }
    } 

    private void chkBoxRow_Click(object sender, RoutedEventArgs e)
    {
        if (chkBoxContent.IsChecked.Value)
        {
            //if checked do something here 
        }
        else if (!chkBoxContent.IsChecked.Value)
        {
            //if unchecked do something here
        }
    }

答案 2 :(得分:0)

我明白了,伙计们。 我似乎忘了实施INotifyPropertyChanged。 这一切都可以正常运作。谢谢: - )