WPF: странное поведение ComboBox после обновления до .net framework 4.7.2

После обновления до .NET Framework 4.7.2 я заметил странное поведение ComboBox, когда он находится в DataGridTemplateColumn.CellEditingTemplate.

<DataGrid
        IsReadOnly="False"
        ItemsSource="{Binding Path=Items, Mode=OneWay}">
        <DataGrid.Columns>
            <DataGridTemplateColumn
                Header="Test"
                IsReadOnly="False"
                Width="70">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock
                            VerticalAlignment="Center"
                            TextAlignment="Left"
                            Text="{Binding Path=Id, Mode=OneWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox
                            Name="cmbTest"
                            DisplayMemberPath=""
                            HorizontalAlignment="Stretch"
                            IsEditable="True"
                            IsEnabled="True"
                            IsReadOnly="False"
                            IsSynchronizedWithCurrentItem="False"
                            ItemsSource="{Binding Path=Items2, Mode=OneWay}"
                            Margin="0"
                            SelectedItem="{x:Null}"
                            SelectedValue="{x:Null}"
                            SelectedValuePath=""
                            Text=""
                            VerticalAlignment="Center"
                            Visibility="Visible"
                            SelectionChanged="cmbTest_SelectionChanged">
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Перед обновлением событие «cmbTest_SelectionChanged» возникало только при изменении SelectedItem, но теперь (после обновления 4.7.2.) «cmbTest_SelectionChanged» возникает (с «нулевым» SelectedItem!) также при выходе из редактирования ячейки... и это проблема для моего приложения.

Как я могу избежать этой проблемы?

ОБНОВЛЕНИЕ 16/06/2018: я обнаружил, что проблема возникает только тогда, когда список привязки к ComboBox (Items2) является свойством SelectedItem. Если я привязываю список к внешнему контексту данных (FindAncestor...), он работает правильно.


person Luca Petrini    schedule 15.05.2018    source источник


Ответы (1)


Это следствие исправления ошибки, задокументированного здесь: исправлено повреждение данных, возникающее при прокрутке DataGrid с VirtualizationMode=Recycling. [405066, PresentationFramework.dll, ошибка].

Повреждение возникло из-за того, что привязки в шаблоне редактирования ячейки продолжали реагировать на изменения даже после выхода из редактирования ячейки. Исправление отключало все привязки при выходе из редактирования. В вашем случае это устанавливает для ComboBox.ItemsSource значение null, что вызывает событие SelectionChanged. Вы можете легко проигнорировать это событие, проверив, имеет ли ComboBox.ItemsSource значение null.

person Sam Bent - MSFT    schedule 16.05.2018
comment
Спасибо за ответ, я заметил ошибку в прошлом stackoverflow. com/questions/43585684/ ... чтобы избежать этого, я реализовал специальный метод для отключения моего пользовательского элемента управления при завершении редактирования ячейки. Изменение поведения selectionchanged влияет на другие точки моего приложения... Я постараюсь их контролировать. (Примечание: цель моего приложения — .Net 4.0) - person Luca Petrini; 17.05.2018