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 是否为空来轻松忽略此事件。
升级到 .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 是否为空来轻松忽略此事件。