滚动网格后,WPF DataGridComboBoxColumn为什么会显示不正确的数据?

问题描述

我有一个UserControl,其中包含绑定到视图模型的DataGrid。有几列,包括两个DataGridComboBoxColumns。第一次渲染网格时,显示的所有数据都是完全正确的,并且ComboBox下拉列表包含可供选择的正确项目。一切都很好。

但是,只要我稍微滚动一下,以便将某些行从视图中滚动出来,然后又重新回到视图中,则组合框列中显示的数据就会消失。我在视图模型中实现了INotifyPropertyChanged,在调试之后,我确定没有什么会改变模型中的实际数据。我认为只有DataGridComboBox单元被弄乱了。为什么在关联的行首次出现在屏幕上时它们会正确显示,但是当该行滚动回视图时却显示为空白?

以下是您可能想知道的一些细节:

  • UserControl的构造函数设置DataContext = this
  • DataGrid的ItemsSource绑定到UserControl的Records属性,该属性ObservableCollection<viewmodel>(其中viewmodel是我的视图模型的类型,natch)。我是从List<viewmodel>构建的。
  • 视图模型包含只读IDictionary属性(例如,一个名为PossibleCustomerGroups属性),以便我可以像绑定所选值成员一样,在XAML中绑定组合框ItemSource属性。与其他名称空间或数据上下文融合。视图模型的所有实例都引用相同的字典,这些字典在创建时会从UserControl传递给它们,因此字典引用在UserControl的生命周期内不应更改。

牢记这一点,这是有问题的列之一的定义方式:

      <DataGridComboBoxColumn Header="Customer Group"
                              SelectedValueBinding="{Binding CustomerGroupCode}"
                              displayMemberPath="Value"
                              SelectedValuePath="Key"
                              >
        <DataGridComboBoxColumn.ElementStyle>
          <Style>
            <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=PossibleCustomerGroups}" />
          </Style>
        </DataGridComboBoxColumn.ElementStyle>
        <DataGridComboBoxColumn.EditingElementStyle>
          <Style>
            <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=PossibleCustomerGroups}" />
          </Style>
        </DataGridComboBoxColumn.EditingElementStyle>
      </DataGridComboBoxColumn>

它绑定到视图模型的CustomerGroupCode属性,该属性一个整数,并且是PossibleCustomerGroupCodes字典的键。

一个简单的例子,使用虚构数据,观察我的行为:

  1. 当网格首次出现时,一切看起来正确,包括第1行,这表明销售员“ John Doe”与“航空航天客户”客户组相关联。
  2. 如果单击“客户组”单元格,则会出现“组合框”,然后可以将其下拉以查看公司的所有客户组。当我关闭下拉菜单而不进行任何更改时,组合框将保持不变,直到将焦点移到其他单元格上为止。
  3. 我向下滚动并向上滚动,以便John Doe消失然后重新出现。
  4. 这一次,该行显示了John Doe的姓名,但是“客户组”列通常为空白。视图模型的PropertyChanged事件尚未触发。空单元已死。单击组合框时不会出现。
  5. 对于滚动到视图和返回视图的任何行,这种情况都是随机发生的。当我继续滚动时,这种方式损坏了越来越多的行。

我做错了什么?还是可以提供有关调试此问题的任何线索?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)