【问题标题】:Bind ObservableCollection to a Collection将 ObservableCollection 绑定到集合
【发布时间】:2012-10-31 11:39:16
【问题描述】:

我做了一个包含 4 个项目的解决方案,UI、BL、DAL 和 BO。

  • UI:用户控件、窗口。
  • BL:一些逻辑和一个静态类。
  • Dal:静态类存储库。
  • BO:我的对象(Person,...)

前3个项目参考BO项目,UI参考BL,BL参考DAL。 在 BL 项目中,我有一个 Collection,在我的 UI(在 ViewModel 中)我有一个 ObservableCollection,问题是这两个 Collections 之间的绑定,例如,当我想加一个人,我必须这样做:

BL.Persons.Add( new Person() { Name = "Paul"});
this.Persons = new ObservableCollection<Person>(BL.Persons);

它有效,但我不确定这是否是最好的方法。

【问题讨论】:

    标签: wpf mvvm observablecollection


    【解决方案1】:

    您不应该每次都重新创建您的ObservableCollection。在这种情况下没有意义,因为ObservableCollection 应该通知观察者有关更改。当然这是可行的,因为 Persons 发生了变化,但是对于较大的集合来说效率非常低,因为它会表现得好像每个对象都发生了变化,但实际上只添加了一个新对象。

    这对你更好:

    var person = new Person() { Name = "Paul"};
    BL.Persons.Add(person);
    this.Persons.Add(person);
    

    顺便说一句,我不喜欢这种模型/视图模型混合,如果你只将 viewmodels 暴露给你的 view 会更好,更干净,但这是一个不同的问题。

    【讨论】:

    • 感谢 Peter 的回答,如果您能告诉我更多关于模型/视图模型混合的信息吗?
    • BL.Persons 也设为ObservableCollection 并让this.Persons 成为同一个实例不是更好吗?您将设置this.Persons = BL.Persons 一次,现在只有一个集合而不是两个。
    • @DotNeter, ObservableCollection 也适用于 winforms。只是在WinForms 中你必须重新绑定ObservableCollection.CollectionChanged 事件。
    • @DotNeter 您正在公开您的模型,就好像它是一个视图模型一样。您应该创建一个人视图模型,该视图模型模拟实际视图。您的业​​务实体不是您的视图模型。
    • 如果答案对您有帮助,那么您应该投票和/或接受它。
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2019-02-24
    • 2011-05-20
    • 2013-03-03
    相关资源
    最近更新 更多