【问题标题】:WPF MVVM DataGrid ItemsSource binding to different collectionWPF MVVM DataGrid ItemsSource 绑定到不同的集合
【发布时间】:2018-07-16 11:33:36
【问题描述】:

我有一个带有动态菜单的窗口和一个 DataGrid,它根据单击的菜单项显示不同的记录。 每个菜单项都返回一个自定义类的 ObservableCollection。 所有的类都是不同的,不一定相互关联。

目前,我在 ViewModel 中创建了一个 ObservableCollection(Of Object),每次单击菜单项时都会用新结果填充它。 问题是 Object 没有实现 INotifyPropertyChanged,迫使我手动分配 ItemsSource。

我确信有办法完成我所追求的,但我想不出。

【问题讨论】:

    标签: wpf vb.net mvvm datagrid


    【解决方案1】:

    你有两个选择:

    • 清除 ObservableCollection,然后将新项目添加到其中。这可能会很慢,因为当您执行此操作时会触发多个通知(事件),如果它超过几十个项目,那么您将开始注意到一些 UI 在执行时变慢

      李>
    • 确保您的视图模型实现 INotifyPropertyChanged 并且包含 ObservableCollection 的属性会触发属性更改通知。然后,当您要显示新列表时,只需分配一个新的 ObservableCollection。

    因为您的集合包含不同类型的对象,我相信您已经研究了 Data Templating (another example) 来构建您的 UI - 这样您就可以拥有一个取决于列表项类型的自定义布局.

    【讨论】:

    • 我实际上有多个集合,但每个集合都包含相同类型的项目。此外,我的 ViewModel 已经实现了 INotifyPropertyChanged,但是如果我使用 ObservableCollection(Of Object),即使我向集合中添加新项目,它也不会触发 PropertyChanged 事件。
    • @FabioL.ObservableCollection 实现了INotifyCollectionChanged,这意味着它确实在添加或删除项目时发出通知。您没有包含任何代码,因此我必须假设您正确地收到了从包含 ObservableCollection 的 VM 属性的设置器发出的通知。集合中的对象类型没有任何区别。也许您可以在问题中添加更多细节以获得更准确的答案?
    • 经过深思熟虑,我最终使用 IEnumerable 作为 DataGrid 的源。通过这种方式,我能够直接分配每个集合,而无需手动添加每个项目。我仍然对事情的运作方式并不完全满意,但目前它运作良好。将来我会尝试找到一种方法来改进 Window 背后的逻辑。感谢您的帮助!
    猜你喜欢
    • 2023-03-07
    • 2017-10-23
    • 2010-12-10
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2013-12-17
    相关资源
    最近更新 更多