【问题标题】:MVVM Pattern, ObservableObjectMVVM 模式,ObservableObject
【发布时间】:2012-11-22 06:22:38
【问题描述】:

请帮助我理解 MVVM 模式中的一件事:

例如,我需要在地图上显示城市。 在 ViewModel 我有 ObservableCollection,它绑定到一个 View ItemsSource。 ObservableCollection 包含类型为“City”的对象。 必须从 ObservableObject 继承“City”类(我使用 MVVM Toolkit)吗?或者我应该创建一个包装类,从 ObservableObject 继承它,在 ViewModel 中使用来自“City”对象的数据创建新的包装对象并将它们添加到集合中?

谢谢!

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    假设您的 City 类在您的模型中,并且您实际上需要了解 city 对象属性的更改 - 那么您应该为它创建一个包装器(即 CityViewModel)。您的包装器应该监听通知 City 类的任何更改的事件,并触发相关的 Property Change 通知。

    模型类的设计应与模型相适应,并且不应更改以适应您的视图 - 首先拥有 ViewModel 的目的是从您的视图中抽象出您的模型。模型应该对视图一无所知。

    如果你的 City 类的属性没有改变,或者你不在乎它们是否改变(而且你不是纯粹主义者),那么你可以直接公开它 - 而不继承 ObservableObject。 (虽然我不使用 MVVM 工具包,但我不明白为什么你需要继承 ObservableObject 只是因为你将 City 对象存储在 ObservableCollection 中)。

    然而,纯粹的视图是包装您绑定到的所有内容,并且从不将模型中的任何内容直接暴露给视图。

    【讨论】:

    • 好的,我明白了。看来我误解了模式。看起来模型没有任何逻辑(即从数据库加载数据),它只包含数据,对吧?但是,正如您所说(纯粹视图),绑定到 View 的每个模型类都必须由 ViewModel 类包装,并且看起来会有很多 ViewModel 和一个 View 或只有一个 ViewModel 可以包装所有模型类?
    • @Shallow - 换行是什么意思。您的视图已绑定到视图模型,并且视图模型中包含模型。
    • MVVM 中的模型包括应用程序的所有业务逻辑部分。这包括保存数据的对象,以及获取数据、与服务通信或执行任何其他业务功能的对象。看看msdn.microsoft.com/en-us/magazine/ff798279.aspx,它提供了一些一般信息,而blog.alner.net/archive/2010/02/09/… 几乎可以回答你的问题。
    • 好的,谢谢。因此,例如,如果我需要将纬度和经度属性转换为仅用于绘图的 X、Y(像素),我应该为“City”类创建 ViewModel。此外,我还有 MainViewModel 包含 ObservableCollection 和城市来显示所有城市。对?很简单,我使用其他项目中的类并尽量减少对它们的修改。
    【解决方案2】:

    ObservableCollection 或 ObservableObject 与 MVVM 模型无关。您可以在没有 ObservableCollection 和 ObservableObject 的情况下创建基于 MVVM 的应用程序(当您需要更改类的属性值时使用 ObservableObject,但如果您的应用程序是只读的,您甚至不需要它)。

    MVVM - M-Model(业务层)、V-View(GUI)、ViewModel-(GUI的上下文)。

    当 XAML 用于绑定时。您必须需要一种通知机制来通知 GUI 某些内容已更改。现在,如果更改集合意味着您从集合中添加或删除了一个项目,则需要发出一个通知,如果您正在使用 ObservableCollection,则不需要该通知。同样,如果你的类 City 有一个属性 Population,当更改需要通知 GUI 时,这就是为什么需要创建一个 ObservableObject。

    希望对你有帮助..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2012-06-18
      • 2013-08-16
      • 2018-03-25
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多