【问题标题】:WPF Datagrid RowVirtualization problem with framework .NET 4.8框架 .NET 4.8 的 WPF Datagrid RowVirtualization 问题
【发布时间】:2019-06-26 14:59:52
【问题描述】:

使用新的 .NET 4.8 框架,我在 WPF 数据网格中检测到上下滚动时带有组合框的问题:

下图有问题: "图像显示了一些空的组合框。加载程序时,这些组合框已填充数据,但当您在应用程序中上下滚动时,数据消失了"

如果我在数据网格中将 EnableRowVirtualization 设置为 false,则无法检测到问题。

使用以前版本的框架(4.7 或更早版本)我没有这个问题,无论 EnableRowVirtualization 配置为 true 还是 false。

为什么?

<DataGrid Focusable="True" Grid.Column="0" Grid.Row="0" HeadersVisibility="Column" RowHeaderWidth="0" AutoGenerateColumns="False" ItemsSource="{Binding People}" CanUserAddRows="False" CanUserDeleteRows="False" SelectionUnit="FullRow" IsTabStop="True">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Name" IsReadOnly="True" MinWidth="50" Binding="{Binding Name, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
    <DataGridTemplateColumn Header="Age Old">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <ComboBox ItemsSource="{Binding Ages, TargetNullValue=''}" SelectedValue="{Binding Age, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=LostFocus, TargetNullValue=''}">
                            </ComboBox>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 图片有什么问题?什么滚动活动会导致问题?问题可能取决于您的数据 - 如果您可以附上(或链接到)说明问题的完整解决方案,将会很有帮助。
  • 图片显示了几个空的组合框。加载程序时,这些组合框会填充数据,但当您在应用程序中上下滚动时,数据会消失。

标签: c# .net wpf datagrid virtualization


【解决方案1】:

这是 .NET 4.8 中的 WPF 错误 - 它已在今年秋季发布的管道更新中得到修复。这是知识库简介:

DataGrid 单元格中的 WPF 组合框(或任何选择器)可以尝试 更改其选择属性(SelectedIndex、SelectedItem、 SelectedValue) 当单元格的数据项被重新虚拟化或移除时 从基础集合。如果选择器的 ItemSource 属性通过单元格的 DataContext 进行数据绑定。
取决于虚拟化模式和为 选择属性,症状可能包括意外的变化(到 null) 数据项的属性,或意外显示(为 null) 碰巧重复使用以前附加到的 UI 的其他数据项 重新虚拟化的项目。

与此同时,您可以通过以某种不依赖于 DataContext 的方式绑定 ComboBox.ItemsSource 来解决该错误。通常集合并不真正依赖于单个数据项,因此您可以绑定到固定集合。在您的示例中,如果 Ages 属性指向每个数据项的同一集合,则可以直接绑定到它:ItemsSource="{Binding Source={StaticResource Ages}}" 在声明为 &lt;CollectionViewSource x:Key="Ages"/&gt; 的资源范围内,其 Source 指向(共享) 允许年龄列表。 (有很多方法可以设置Source:在初始化代码中以编程方式将其绑定到更高级别的视图模型的属性等)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多