【问题标题】:combobox itemssource binding issue组合框项目源绑定问题
【发布时间】:2011-05-20 19:59:23
【问题描述】:

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

数据流动的方式相对简单

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

我对此感到茫然,我一直在研究这个问题。

有人有想法吗?有什么调试建议吗?

谢谢,

亚历克斯

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

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

【问题讨论】:

    标签: wpf mvvm binding combobox


    【解决方案1】:

    ** 编辑 **

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

    清空集合,通知GUI,将通知的真实集合添加到gui

    【讨论】:

    • 也不起作用。困扰我的是,我可以看到实际 ComboBox 的集合正在通过我添加到绑定中的转换器进行更新。当集合更改时,将调用 Converter 并且经过的对象(ItemsSource 集合)包含新项目。但是,在我更改主列表中选定的警报之前,它不会显示在下拉列表中。
    • 嗯,我也遇到过这个问题。做了一个黑客来修复它....清空集合,通知 GUI,添加通知给 gui 的真实集合......丑得要命,但对我有用
    • 无论多么丑陋,它都在工作。如果您将其发布为答案而不是评论,我会将其标记为答案。 (除非有人提供真正的解决方案,这对我们双方都有好处!:-))
    【解决方案2】:

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

    举个例子

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

    【讨论】:

    • 您是指将 ComboBox 的 ItemsSource 属性绑定到 CollectionViewSource,而不是将其直接绑定到 ViewModel 的 ObservableCollection,还是您的意思是将 DetailsView 的 DataContext 绑定到 MasterView 项目集合的当前项(看起来喜欢第二个选择)?我尝试了它(DataContext 选项),但没有成功。
    • 将 CollectionViewSource 绑定到 ViewModel 中的主集合。将您的主 ItemsControl (ComboBox) 绑定到您的 CollectionViewSource。将您的详细信息控件绑定到 CollectionViewSource 的 CurrentItem 属性。还要确保您的 ItemsControl 具有 IsSynchronizedWithCurrentItem="True"
    • 好的,我意识到我的解释可能并不完全清楚。有故障的 ComboBox 位于 DetailsView 中(它设置了详细信息属性之一)。选择要显示哪个 DetailsView 的不是 ComboBox。
    猜你喜欢
    • 2020-12-26
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多