Ошибка автоматического выбора флажка в сетке данных WPF?

#c# #wpf #datagrid

#c# #wpf #datagrid

Вопрос:

У меня есть DataGrid и загружаю некоторые данные пользовательского типа. Также есть Checkbox column . Когда флажок установлен, данные текущей строки берутся следующим кодом. Для первого флажка все в порядке.

Затем я устанавливаю другой флажок, и он проверяется, но когда я прокручиваю данные, я вижу, что в некоторых других строках флажок установлен автоматически! И когда я снова поднимаюсь, флажок, который я установил в первый раз, теперь снят, а какой-то другой установлен автоматически!

Код, который я использую для события checked.

 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>  
  

И вот картина того, что происходит!
Первый рисунок: все нормально, выбрана только первая строка

Второй рисунок: выберите другой, но посмотрите, что третий столбец был автоматически проверен, Когда я прокручиваю вниз, я вижу, что некоторые другие также проверены

3-й рисунок: теперь я прокручиваю вверх и вижу, что первый флажок был автоматически снят каким образом? введите описание изображения здесь

введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. Вы пытались установить для свойства Datagrid значение EnableRowVirtualization в значение false

2. @SajithSageer ахахах, это сработало, ты гениальный человек, спасибо!

Ответ №1:

Как @SajithSageer сказал, что настройка EnableRowVirtualization= false для DataGrid устраняет эту проблему.

Комментарии:

1. Это не оптимальное решение, если у вас много записей, в этом случае создайте модель представления для каждой строки сетки данных и привяжите свойство checkbox is checked к логическому свойству viewmodel.