我有一个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>
,其中包含该货件的所有产品。
有什么想法吗?
答案 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
。
这一切都可以正常运作。谢谢: - )