带有复选框的 WPF DataGrid 列不起作用

问题描述 投票:0回答:2

我有一个非常奇怪的行为,

DataGridTemplateColumn
持有一个
CheckBox

该模板包含一个复选框,当前未出于测试目的绑定到任何内容。
这是问题的演示
这是代码:

<DataGrid Margin="0,78,0,0"
            ItemsSource="{Binding Prikaz}" 
            AutoGenerateColumns="False" 
            CanUserAddRows="False" 
            CanUserSortColumns="False"
            CanUserResizeColumns="False"
            HorizontalGridLinesBrush="#D6D6D6"
            VerticalGridLinesBrush="#D6D6D6"
            HeadersVisibility="Column">
            <DataGrid.Columns>
                <DataGridTemplateColumn Width="25">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox HorizontalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <CheckBox/>
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
</DataGrid>

网格绑定到

DataTable
,因此它会生成行。

问题: 如果我检查网格中的几个

CheckBox
项目,然后快速滚动,则网格中的
CheckBox
项目开始随机检查和取消检查。到目前为止,我几乎没有找到任何关于这个问题的信息。对于这种奇怪的行为有解释吗?

c# .net wpf datagrid
2个回答
0
投票

出于性能原因,默认情况下会重用项目容器中的

CheckBox
元素。您可以通过将
VirtualizingPanel.VirtualizationMode
附加属性设置为
Standard
来关闭虚拟化:

<DataGrid ... VirtualizingPanel.VirtualizationMode="Standard">

另一个选项是使用数据绑定将

CheckBox
绑定到内存中对象的属性,该属性在滚动时不会更改。


0
投票

我对将我的复选框绑定到对象属性不感兴趣。 对我来说,诀窍是禁用行虚拟化:

<DataGrid x:Name="MyDataGrid" EnableRowVirtualization="False"/>

虚拟化造成的所有混乱都消失了。

© www.soinside.com 2019 - 2024. All rights reserved.