组合框项目资源绑定问题

时间:2010-12-06 07:32:18

标签: wpf mvvm binding combobox

在MVVM WPF应用程序中,我有一个用于管理警报的主 - 详细视图。在AlarmDetails视图中,我有几个通过ComboBox控件设置的属性。其中一个是Alarm的Source,这些源可以在另一个View(SourcesView)中更改,从而改变AlarmDetailsView中的组合框内容。

数据流的方式相对简单

  1. 在SourcesView
  2. 中将源添加到集合中
  3. 从SourcesView发送消息,并由所有AlarmDetailsViewModel
  4. 接收
  5. 每个AlarmDetailsViewModel中的Sources集合都会相应更改,因为它是ObservableCollection,它会通知每个绑定目标更改
  6. AlarmDetailsView将其DataContext设置为选定的AlarmDetailsViewModel,因此更新了Sources ComboBox的ItemsSource属性(我看到它使用虚拟转换器,在调试中我可以看到更新的集合传递给ItemsSource,它包含新增项目)
  7. 发生这一切后,当我导航到AlarmsView / AlarmDetailsView选项卡时,Sources ComboBox中的项目不包含新项目。
  8. 当我在主列表中选择一个新报警并且我选择原来的报警时,组合框显示新项目就好了(当我在主列表中选择一个项目时,AlarmDetailsView的DataContext属性会更新)。
  9. 我对此感到茫然,我已经暂时搁置了一段时间。

    有人有想法吗?任何调试建议?

    谢谢,

    亚历

    编辑:未更新的ComboBox位于AlarmDetailsView中,这意味着它用于设置Alarm对象的属性(即Source,即)。希望这会有所帮助。

    编辑2:除了下面的答案,另一个解决方案是使用ObservableCollection而不是List。出于某种原因,在List上引发PropertyChange事件(如上所述)会触发ComboBox刷新其ItemsSource,但不会将新项添加到其下拉列表中。使用ObservableCollection,不需要引发propertychange事件,因为它自己管理它。

2 个答案:

答案 0 :(得分:0)

尝试使用CollectionViewSource来处理Master / Detail绑定。

下面是一个例子

<Window.Resources>
    <CollectionViewSource x:Key="data" Source="{Binding}" />
<Window.Resources>

DataContext="{Binding CurrentItem, Source={StaticResource data}}"

答案 1 :(得分:0)

**编辑**

丑陋的解决方案,但如果有人有更好的解决方案,请为我工作,请分享:)

清空收集,通知GUI,添加通知gui的真实收藏