【问题标题】:WPF DataGrid Automatically selecting checkbox bug?WPF DataGrid自动选择复选框错误?
【发布时间】: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 啊哈哈,你是天才,谢谢!

标签: c# wpf datagrid


【解决方案1】:

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

【讨论】:

  • 如果您有很多记录,这不是最佳解决方案,在这种情况下,为数据网格的每一行创建一个视图模型并将复选框选中属性与视图模型的布尔属性绑定。
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 2018-06-24
  • 2016-01-13
  • 1970-01-01
  • 2010-10-19
  • 2017-08-27
  • 2012-06-27
  • 2011-04-19
相关资源
最近更新 更多