WPF DataGrid自动选择复选框错误?

Posted

技术标签:

【中文标题】WPF DataGrid自动选择复选框错误?【英文标题】:WPF DataGrid Automatically selecting checkbox bug? 【发布时间】:2019-09-13 08:14:58 【问题描述】:

我有一个DataGrid 并加载了一些自定义类型的数据。还有一个Checkbox column。当复选框被选中时,当前行数据由以下代码获取。对于第一个复选框,这很好。

然后我选中另一个复选框,它被选中,但是当我滚动浏览数据时,我看到其他一些行复选框自动选中!当我再次选中我第一次选择的复选框时,现在未选中,并且自动选择了其他一些复选框!

我用于检查事件的代码。

private void CheckBox_Checked(object sender, RoutedEventArgs e)

    var selectedOrder = MyDataGrid.SelectedItem as AutoOrderClass;
    if (selectedOrder != null)
    
        var order = SelectedOrdersList.FirstOrDefault(x => x.VendorName == selectedOrder.VendorName);
        if (order == null)
        
            OrdersCount++;
            TotalOrders.Text = "Total Orders : " + OrdersCount;
        

        SelectedOrdersList.Add(selectedOrder);
    
   

这是 Xaml

<DataGrid x:Name="MyDataGrid" VerticalScrollBarVisibility="Visible" ScrollViewer.CanContentScroll="True"
          AutoGenerateColumns="False"
          HorizontalScrollBarVisibility="Auto" Height="Binding ActualHeight, ElementName=DataGridContainerPanel">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn x:Name="CheckBoxColumn" Header="Select">
            <DataGridCheckBoxColumn.CellStyle>
                <Style>
                    <EventSetter Event="CheckBox.Checked" Handler="CheckBox_Checked"/>
                    <EventSetter Event="CheckBox.Unchecked" Handler="CheckBox_Unchecked"/>
                </Style>
            </DataGridCheckBoxColumn.CellStyle>
        </DataGridCheckBoxColumn>
        <DataGridTextColumn Header="Item Name" Width="120" Binding="Binding Name"></DataGridTextColumn>
        <DataGridTextColumn Header="Description" IsReadOnly="True" Width="*" Binding="Binding Description"></DataGridTextColumn>
        <DataGridTextColumn Header="VendorName" IsReadOnly="True" Width="*" Binding="Binding VendorName"></DataGridTextColumn>
        <DataGridTextColumn Header="Quantity In Hand" Width="100" Binding="Binding StockQuantity"></DataGridTextColumn>
        <DataGridTextColumn Header="Order QTY" Width="70" Binding="Binding OrderQuantity,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True"></DataGridTextColumn>
        <DataGridTextColumn Header="Unit Price" Width="80" Binding="Binding UnitPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True"></DataGridTextColumn>
        <DataGridTextColumn Header="Total Price" Width="70" Binding="Binding TotalPrice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True"></DataGridTextColumn>
    </DataGrid.Columns>

</DataGrid>  

这是正在发生的事情的图片!第一张图片:一切都很好,只选择了第一行

第二张图片: 选择另一个但看到第三列被自动检查当我向下滚动时,我看到其他一些也被检查了

第三张图片:现在我向上滚动,看到第一个复选框是自动取消选中的怎么办?

【问题讨论】:

您是否尝试将Datagrid的EnableRowVirtualization属性设置为false @SajithSageer 啊哈哈,你是天才,谢谢! 【参考方案1】:

正如 @SajithSageer 所说,为 DataGrid 设置 EnableRowVirtualization= false 可以解决此问题。

【讨论】:

如果您有很多记录,这不是最佳解决方案,在这种情况下,为数据网格的每一行创建一个视图模型并将复选框选中属性与视图模型的布尔属性绑定。

以上是关于WPF DataGrid自动选择复选框错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IEditableObject 对象在 WPF DataGrid 中执行单击复选框选择

在 WPF 中使用 Datagrid 的多选复选框

以编程方式在 WPF DataGrid 中选择多行

wpf datagrid 输入编辑

排序时复选框在 WPF Datagrid 中重置

如何在 Datagrid WPF c# 中添加复选框