【问题标题】:How should I access the underlying entity/model of a ViewModel我应该如何访问 ViewModel 的底层实体/模型
【发布时间】:2010-09-08 16:03:43
【问题描述】:

我们正在设计一个 WPF / MVVM 应用程序,允许用户搜索和操作联系人记录。

我们有一个 MainViewModel,它包含一个可观察的 ContactViewModel 对象集合,每个对象都包装了一个从我们的业务层返回的 Contact 实体。 UI 将它们显示在一个列表中,其中 SelectedItem 属性绑定到 MainViewModel 上的相应 SelectedContact 属性。

我们还将有一个按钮或其他东西,其中命令绑定到 MainViewModel 公开的“ProcessContact”ICommand。

ProcessContact 需要获取选定的联系人并对其进行处理,这并不重要。

我的问题是:获取由所选 ContactViewModel 包装的基础 Contact 对象的正确方法是什么?我可以在我的视图模型上公开一个 Contact 属性,但这意味着视图可能会直接绑定到模型之外的属性。

我发现自己传递了很多 ViewModel 实例,当我真正想要的是它所包装的实体时,这感觉不对。

我是否遗漏了一些明显的东西?

编辑:同事提出的一些建议:

  • 将实体公开为 ViewModel 上的受保护属性,这将停止视图绑定到它(假设视图类位于单独的程序集中)

  • 完全停止尝试访问模型。如果我们想以某种方式处理底层实体,我们调用 ViewModel 上的方法。在我的示例中,我们可能有一个关闭 ContactViewModel 的 .Process 方法。 (‘SelectedContact.Process()’)

第二个选项对我来说是一个更好的解决方案,但不确定我们是否应该将这么多逻辑放入 ViewModel(但如果没有,那么在哪里?)

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    您的第二个建议对我来说似乎更正确。我通常将我的数据包装在一个视图模型中,无论如何它就像一个控制器......它应该通过用户在视图中的操作来控制你的数据发生的事情。所以我会去包装你的数据,然后将适当的行为附加到你的视图模型上。我不知道你为什么会担心给你的视图模型添加太多的逻辑,这就是它的工作!

    【讨论】:

      【解决方案2】:

      我建议在 MainViewModel 中有一个可观察的联系人对象集合。框架将自动支持实体属性的更改通知,您甚至不需要在实体中实现 INotifyPropertyChanged。

      如果您有任何特定原因将您的联系人实体包装在视图模型中(我很想知道它们),您将不得不公开联系人对象(通过一个属性 ) 并使用它。

      【讨论】:

      • 如果我想绑定到例如联系人的姓氏怎么办。我的联系人实体不支持 INotifyPropertyChanged(它也不应该是 POCO 业务对象),但 ContactViewModel 支持,并且可以将属性更新编组到联系人,同时提高 NotifyPropertyChanged。请参阅 msdn 上的 Josh Smiths MVVM 文章:msdn.microsoft.com/en-us/magazine/dd419663.aspx - 将他的 Customer / CustomerViewModel 替换为我的 Contact / CntactViewModel,您将遇到几乎相同的情况。
      【解决方案3】:

      不要将模型包装在 ViewModel 中。至少不要将其公开为公共财产。

      您可以让您的 Presenter 成为模型的观察者,以便在模型更改时收到通知。您的 Presenter 然后可以调用 View 并将 ViewModel 传递给它

      【讨论】:

      • 我认为将模型包装在 ViewModel 中在 MVVM 中并不常见。请参阅 Josh Smiths 在 msdn 上的文章:msdn.microsoft.com/en-us/magazine/dd419663.aspx,其中他的每个 CustomerViewModel 类都有对基础 Customer 对象的引用)。在这种情况下,模型类只是数据的容器,不会暴露任何使它们可观察的东西(属性更改通知等),这就是 VM 的用途......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 2012-02-21
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多