WPF数据网格和项目容器回收

时间:2017-07-26 03:46:23

标签: wpf checkbox datagrid

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

0 个答案:

没有答案