【发布时间】:2011-05-20 19:59:23
【问题描述】:
在 MVVM WPF 应用程序中,我有一个用于管理警报的主从视图。在 AlarmDetails 视图中,我有几个通过 ComboBox 控件设置的属性。其中之一是警报源,这些源可以在另一个视图(SourcesView)中更改,从而更改警报详细信息视图中的组合框内容。
数据流动的方式相对简单
- 一个源被添加到 SourcesView 中的集合中
- 消息从 SourcesView 发送并被所有 AlarmDetailsViewModel 接收
- 每个 AlarmDetailsViewModel 中的 Sources 集合会相应更改,因为它是 ObservableCollection,它会通知每个绑定目标更改
- AlarmDetailsView 将其 DataContext 设置为选定的 AlarmDetailsViewModel,因此其 Sources ComboBox 的 ItemsSource 属性已更新(我看到它使用虚拟转换器,在调试中我可以看到更新的集合被传递给 ItemsSource,它包含新添加的项目)
- 发生这一切之后,当我导航到 AlarmsView/AlarmDetailsView 选项卡时,Sources ComboBox 中的项目不包含新项目。
- 当我在主列表中选择一个新警报并选择原始警报时,组合框会很好地显示新项目(当我在主列表中选择一个项目时,AlarmDetailsView 的 DataContext 属性会更新)。
我对此感到茫然,我一直在研究这个问题。
有人有想法吗?有什么调试建议吗?
谢谢,
亚历克斯
编辑:不更新的ComboBox位于AlarmDetailsView中,这意味着它用于设置Alarm对象的一个属性(即其Source)。希望这会有所帮助。
编辑 2:除了下面的答案之外,另一个解决方案是使用 ObservableCollection 而不是 List。出于某种原因,在 List 上引发 PropertyChange 事件(如上所述)会触发 ComboBox 刷新其 ItemsSource,但不会将新项目添加到其下拉列表中。使用 ObservableCollection,不需要引发 propertychange 事件,因为它自己管理它。
【问题讨论】: