有一个网络服务。
- 它提供类型
Zoo
和Animal
。 Zoo
有一个动物 ID 和名称的字典。Animal
具有属性:Id
、Name
和(其他内容)
。- 它有一个返回动物园对象的方法
GetZoo
。 - 它有一个方法
GetAnimalStuffById
,该方法返回一个Animal
对象,其中包含Id
、Name
和(附加内容)
。
所以想法是 - GetZoo
允许我获取动物 id + 名称的列表,然后 GetAnimalStuffById
获取完整的动物信息。
我在 VS 中向该服务添加了一个“服务引用”,并且想要编写一个 MVVM 应用程序。有些事情我不太明白,需要洗脑。
自动生成的类可以作为我的模型吗?
与示例无关,但无论如何:添加服务引用时应该指定什么“集合类型”?对于模型来说,
ObservableCollection
是否是一种矫枉过正和不好的做法?假设,用户转到显示完整动物信息的应用程序页面。显然,最初我有一个只有
<Id
和Name
值的AnimalViewModel
(取自GetZoo
)。当导航到页面时,我调用GetAnimalStuffById
并获取包含所有数据的Animal
对象。接下来我应该做什么?将我 View 的 DataContext 替换为从新Animal
对象创建的新AnimalViewModel
(A),或者仅替换其中的值 (B)?如果答案是(A),如何替换所有 View 中的 DataContext?
如果答案是 (B),什么会导致更新?虚拟机是否应该订阅某个高级经理关于获取
Animal
更新的事件?或者还有其他方法吗?自动生成的类中
INotifyPropertyChanged
的用途是什么?在我的例子中,它们总是从网络服务中新鲜返回。 Microsoft 是否建议在某些情况下也将它们用作 ViewModel?
谢谢。
最佳答案
以下是根据我自己的 MVVM 经验得出的一些答案(可能是也可能不是“最佳实践”..)
绝对!无需将所有事情都做两次 - 请参阅 #5 和 #6(尽管有些人不同意这里)。
是的,除非您确实需要
ObservableCollection
的功能服务器端,我会说这是矫枉过正,并且可能会让其他人感到困惑。从技术上讲,通过网络发送消息没有任何开销,但我会选择更简单的东西,比如数组。选择选项 B。
-
例如,您的
AnimalViewModel
中可以有一个属性保存所有附加内容:public Animal AdditionalData { ...
。现在,无论谁调用GetAnimalStuffById
可以用Animal
更新当前ViewModel的AdditionalData对象。我假设您已经知道
INotifyPropertyChanged
是为了让 View 知道某些数据在某处发生了更改(如果没有,谷歌搜索“inotifypropertychanged mvvm”应该可以帮助您开始)。现在,连接#1 和#5 中的点,您的 View 现在可以通过“AdditionalData”属性绑定(bind)到动物的附加数据,而无需在 ViewModel 中重新创建所有内容:<TextBox Text="{Binding Path=AdditionalData.HeightOrWhatever}" />
.
注意:如果您的 View 不是 WPF 或 Silverlight,则最后一点没有多大意义。
关于wcf - 关于服务引用和 MVVM 模式的一些常见问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14293766/