2

有一个网络服务。

  • 它提供类型ZooAnimal.
  • Zoo有一个动物 ID 和名称的字典。
  • Animal具有属性IdName(additional stuff)
  • 它有一个GetZoo返回动物园对象的方法。
  • 它有一个方法,该方法GetAnimalStuffById返回一个Animal带有Id,Name(additional stuff).

所以这个想法是 -GetZoo允许我获取动物 ID + 名称的列表,然后GetAnimalStuffById获取完整的动物信息。

我在 VS 中为该服务添加了一个“服务引用”,并想编写一个 MVVM 应用程序。有些事情我不完全理解,需要被洗脑。

  1. 自动生成的类可以作为我的模型吗?

  2. 与示例无关,但无论如何:添加服务引用时应该指定什么“集合类型”?对模型来说是ObservableCollection一种矫枉过正和不好的做法吗?

  3. 比如说,用户进入一个显示完整动物信息的应用程序页面。显然,最初我只有一个AnimalViewModelIdName(取自GetZoo)。当页面被导航到时,我调用GetAnimalStuffById并获取一个Animal包含所有数据的对象。接下来我该怎么办?将我的视图的 DataContext 替换为从新对象AnimalViewModel创建的新Animal对象 (A),还是仅替换其中的值 (B)?

  4. 如果答案是 (A),如何替换所有视图中的 DataContext?

  5. 如果答案是 (B),那么应该是什么导致了该更新?虚拟机是否应该订阅一些花哨的经理关于获取Animal更新的活动?还是有其他方法?

  6. INotifyPropertyChanged自动生成的类的目的是什么?在我的情况下,它们总是从网络服务中返回。Microsoft 是否建议在某些情况下也将它们用作 ViewModels?

谢谢。

4

2 回答 2

1

以下是基于我自己的 MVVM 经验的一些答案(这可能是也可能不是“最佳实践”..)

  1. 绝对地!无需将所有事情都做两次 - 参见 #5 和 #6(尽管这里有些人不同意)。

  2. 是的,除非你真的需要ObservableCollection服务器端的功能,否则我会说这有点矫枉过正,而且可能会让其他人感到困惑。从技术上讲,通过网络发送的消息没有开销,但我会使用更简单的东西,比如数组。

  3. 选择选项 B。

  4. -

  5. 例如,你可以有一个属性AnimalViewModel来保存所有额外的东西:public Animal AdditionalData { .... 现在,任何调用的人都可以使用该对象GetAnimalStuffById更新当前 ViewModel 的 AdditionalData 。Animal

  6. 我假设您已经知道INotifyPropertyChanged可以让视图知道某些数据在某处发生了变化(如果没有,谷歌搜索“inotifypropertychanged mvvm”应该让您开始)。现在,连接 #1 和 #5 中的点,您的 View 现在可以通过 AdditionalData属性绑定到动物的附加数据,而无需重新创建 ViewModel: 中的所有内容<TextBox Text="{Binding Path=AdditionalData.HeightOrWhatever}" />

注意:如果您的视图不是 WPF 或 Silverlight,那么最后一点将没有多大意义。

于 2013-01-13T10:37:29.807 回答
1

这是基于我的经验的答案(主要是提供另一种观点)

  1. Models从端点自动生成很好。但我会推荐 POCOModels没有任何INPC麻烦。两个原因,a) 它使Models维护变得更简单和更容易,b) 你不会想Models直接将你的 暴露给View,或者如果你这样做,它们将无法正常工作。

  2. 从 #1 继续,我不会使用ObservableCollectionin Models。再次保持简单,避免Models直接呈现给View.

  3. 选项 (B)

  4. -

  5. 中的所有属性都ViewModel应该实现 INPC。然后,当您更改它们时,绑定将自动更新。您可以将所有AdditionalData值作为AnimalViewModel扁平化数据的属性,也可以拥有一个AdditionalDataViewModel对象来保存额外数据。要从AdditionalData对象映射数据,请AdditionalDataViewModel考虑使用AutoMapperValueInjecter等映射工具。

  6. 我不知道为什么自动生成器会INPC在你的模型中添加东西。你用的是什么工具?无论如何,正如我所说,我不建议INPC在. 相反,您应该从to映射并且只向.ModelsModelsViewModelsViewModelsViewModelsView

于 2013-01-15T09:11:40.163 回答