0

我有一个 DataGrid Shipments and Products。始终会显示发货,并且每个发货的产品都显示在 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 并且我单击“主”复选框,它会被选中,但细节复选框不会。

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

货件有一个List<Product>包含该货件的所有产品。

有任何想法吗?

4

3 回答 3

2

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

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;
            }
        }
    } 
于 2012-10-07T11:44:55.540 回答
0

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

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

请参阅下面的示例代码:

<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>

在代码隐藏中:

    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
        }
    }
于 2012-06-18T13:04:35.717 回答
0

我明白了,伙计们。我似乎忘了实施INotifyPropertyChanged. 现在一切正常。谢谢 :-)

于 2012-06-19T07:17:38.060 回答