在WPF中,我有一个带有嵌入式数据网格的对话窗口。 该对话框的目的是选择要上载的文件。我在数据网格中添加了一列以允许选择。但是行之间存在相当复杂的关系 - 例如,上传一个文件可能需要上传父文件。因此,有一个处理程序可以更新复选框(检查/取消选中并设置isEnabled off / on)
我似乎遇到了问题"物品容器回收"当我在datagrid中获得很多行时。一些定义看起来像
<DataGrid Name="myGrid"
...
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Standard">
<DataGrid.Resources>
<Style TargetType="DataGridColumnHeader" x:Key="DataGridHeaderStyle" >
</Style>
<Style x:Key="SingleClickEditing" TargetType="{x:Type DataGridCell}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
<EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
<EventSetter Event="CheckBox.Unchecked" Handler="OnChecked"/>
</Style>
...
当我第一次创建数据网格时,在设置之前我无法访问数据网格的所有行:
VirtualizingPanel.VirtualizationMode="Standard"
现在对话框初始化我发现我可以访问网格的所有行并将它们设置好。
但奇怪的是,稍后当用户点击复选框时,复选框处理程序方法会尝试从其他行访问该复选框以设置它们。但是,并不是所有的行都可用,我看到了奇怪的结果。
就好像为数据网格关闭了以下内容。 VirtualizingPanel.VirtualizationMode =&#34;标准&#34;
以编程方式在对话框的cs代码中我看不到我能够访问参数grid.VirtualizingPanel以查看值是什么。
我尝试按如下方式获取网格的所有行:
private List<DataGridRow> GetDataGridRows(DataGrid grid)
{
var itemsSource = grid.ItemsSource as IEnumerable;
List<DataGridRow> rows = new List<DataGridRow>();
if (null == itemsSource) return null;
foreach (var item in itemsSource)
{
DataGridRow row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (row!=null) rows.Add(row);
}
return rows;
}
问题是有时候以下内容会返回null:
grid.ItemContainerGenerator.ContainerFromItem(item)
如何确保我始终可以获得所有行的列表?
================================== 添加: 复选框列的XAML列定义如下:
<DataGrid.Columns>
<DataGridCheckBoxColumn ElementStyle="{StaticResource CenteredCheckStyle}" MinWidth="15"
CellStyle="{StaticResource SingleClickEditing}" Visibility="{Binding exists}"
Binding="{Binding Path=toTransfer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"
CanUserSort="False" CanUserResize="false" CanUserReorder="false">
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Checked" Loaded="CheckBox_Loaded"
HorizontalContentAlignment="Center" HorizontalAlignment="Center"
IsThreeState="False" Margin="8 0 0 0" Padding="0 5 0 0"/>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>