【发布时间】:2010-04-13 12:47:15
【问题描述】:
今天我有一个关于 Silverlight (4 RC) MVVM 和继承概念的特殊问题,并正在寻找最佳实践解决方案……我认为我了解 MVVM 背后的基本思想和概念。我的 Model 对 ViewModel 一无所知,因为 ViewModel 本身并不知道 View。 ViewModel 知道 Model,Views 知道 ViewModels。
想象一下以下基本(示例)场景(我尽量保持简短):
我的模型包含一个带有一些基本属性的ProductBase 类、一个添加更多属性的SimpleProduct : ProductBase 和添加另一个属性的ExtendedProduct : ProductBase。根据这个模型,我有几个 ViewModel,最重要的 SimpleProductViewModel : ViewModelBase 和 ExtendedProductViewModel : ViewModelBase。最后但并非最不重要的一点是,根据意见 SimpleProductView 和 ExtendedProductView。将来,我可能会添加许多产品类型(以及匹配的视图 + 虚拟机)。
1.收到模型集合时如何知道要创建哪个 ViewModel?
在调用我的数据提供者方法后,它最终会得到一个List<ProductBase>。例如,它包含一个 SimpleProduct 和两个 ExtendedProduct。如何将结果转换为具有正确的 ViewModel 类型(一个 SimpleProductViewModel 和两个 ExtendedProductViewModels)的ObservableCollection<ViewModelBase>?
我可能检查 Model 类型并相应地构造 ViewModel,即
foreach(ProductBase currentProductBase in resultList)
if (currentProductBase is SimpleProduct)
viewModels.Add(
new SimpleProductViewModel((SimpleProduct)currentProductBase));
else if (currentProductBase is ExtendedProduct)
viewModels.Add(
new ExtendedProductViewModels((ExtendedProduct)currentProductBase));
...
}
...但我认为这是非常糟糕的做法,因为此代码不遵循面向对象的设计。反过来,提供抽象工厂方法会将代码减少到:
foreach(ProductBase currentProductBase in resultList)
viewModels.Add(currentProductBase.CreateViewModel())
并且可以完美扩展,但由于 Model 不知道 ViewModels,这是不可能的。我可能会在这里将界面引入游戏,但我还没有看到这种方法得到证实。
2。选择 ViewModel 时如何知道要显示哪个 View?
这是几乎相同的问题,但在更高的层次上。最终获得所需的ObservableCollection<ViewModelBase> 集合将需要主视图为 ViewModel 选择匹配的 View。
在 WPF 中,有一个 DataTemplate 概念,它可以根据定义的 DataType 提供 View。不幸的是,这在 Silverlight 中不起作用,我发现的唯一替代品是 SLExtensions 工具包的 ResourceSelector,它有问题且不令人满意。
除此之外,问题 1 中的所有问题也适用。
对于我描述的问题,你有一些提示甚至解决方案,希望你能从我的解释中理解?
提前谢谢你!
托马斯
【问题讨论】:
标签: silverlight inheritance mvvm