WPF:更新到 .net Framework 4.7.2 后奇怪的 ComboBox 行为

WPF: strange ComboBox behavior after update to .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>

升级前,仅当我更改 SelectedItem 时才会引发事件 "cmbTest_SelectionChanged",但现在(在 4.7.2. 升级后)引发了 "cmbTest_SelectionChanged"(使用 "null" SelectedItem!)当我通过单元格编辑退出时...这对我的应用程序来说是个问题。

如何避免这个问题?

2018 年 6 月 16 日更新:我发现仅当 ComboBox (Items2) 的绑定列表是 SelectedItem 的 属性 时才会出现此问题。如果我将列表绑定到外部数据上下文(FindAncestor ...),它似乎可以正常工作。

这是 here 记录的错误修复的结果: 修复了使用 VirtualizationMode=Recycling 的滚动 DataGrid 时出现的数据损坏。 [405066,PresentationFramework.dll,错误]。

出现损坏是因为单元格编辑模板中的绑定继续对更改做出反应,即使在单元格退出编辑后也是如此。该修复程序在退出编辑时断开了所有绑定。在您的情况下,将 ComboBox.ItemsSource 设置为 null,这会引发 SelectionChanged 事件。您可以通过测试 ComboBox.ItemsSource 是否为空来轻松忽略此事件。