将viewmodel与model结合使用

将viewmodel与model结合使用

问题描述:

好的这里有一点值得思考。将viewmodel与model结合使用

MVVM声明Model与ViewModel不可知。所以ViewModel公开了View绑定的属性。

微软代码分析规则告诉我将一个属性添加到模型中的公共变量中。

警告:CA1051:Microsoft.Design:因为现场“Employee.name”是 可见其声明类型之外,它的可改变 私人和领域 有添加属性,用相同的可访问性目前,为了提供访问权限。

现在它的2个重复属性,我宁愿让它干,所以我想合并ViewModel和视图。这里还有一件事,Model是一个POCO,并且没有INotifyPropertyChanged,所以让VM知道Model值的变化是另一个问题。我使用了很多基于IList的绑定

我可能会忽略未来的问题吗?

编辑:我忘了提及,我看着how to correctly define Model to ViewModel relation?,在我们的软件中还有一件事是我们有一个单独的实体,它填充了IList,它是一个SERVICE/UTILITY Assembly。 EmployeeViewModel在一个单独的VIEW Assembly中。所以我无法返回ILIst。

还有另一件事这里,该模型是一个POCO,并且不会有任何INotifyPropertyChanged的,因此让虚拟机知道在 模型值的变化是另一个问题

因为(我假设)模型可以从任何地方改变,你唯一的选择是拥有2个INPC - 一个用于Model-ViewModel,一个用于ViewModel-View。

我个人不喜欢这种方法。太多的流程和重构问题(除非你使用反射 - 这是更多的代码和查找,但高度可维护) 只需尝试物理分离模型和ViewModel分开使用部分类。例如Employee.cs和Employee.ViewModel.cs。和它们分组 - 看起来更细

模型需要是可移植的,INPC is fine与便携式类库,所以你可以重复使用在各种目标

不要这样做。我知道这听起来像很多额外的东西,你不需要,但它会让你的应用程序变得更复杂。我发现将ViewModel绑定到支持属性通知是绝对必要的,并让我以视图可以轻松使用的方式呈现数据,而不必绑定到模型中的表示 - ViewModel根据需要在两者之间进行转换。

如果你没有这些层次,未来事物的变化,特别是一旦你通过一定的复杂度将变得非常困难。

现在,无论您听取微软关于在Model上使用公共属性而非公共字段的建议,都取决于您,但如果您稍后需要将某些逻辑放入getter和setter,那么这是一个很好的习惯。自动属性首先可以很好地代替简单的公共字段,在您实际需要之前,您不必声明后台字段。

+0

马修,谢谢你的INotifyPropertyChanged的实现是很“代码级特征”的代码! ViewModel的。具体到我的项目,底层模型的价值可能会改变。那么我的ViewModel如何知道这个?我的模型实际上没有ViewModel可以描述的INotifyPropertyChanged(如果它有一个PropertyChanged处理程序,它不只是一个Model ..它是一个ViewModel)。我觉得对于这个特定的需求教科书MVVM只是没有发生 – 2013-03-19 09:17:24

+0

你可以将你的模型包装在实现INPC的类中。然而,这意味着你有许多样板代码暴露每个属性并触发propertychanged – failedprogramming 2013-03-19 09:32:44

+0

通常的设计假设没有其他任何东西会改变背后的模型。如果这是一种可能性,那么该模型必须提供一种方式来表明发生了变化。有很多方法可以做到这一点,INPC只是其中之一,但它确实需要一些知道该模型实际上已经改变的事物的积极参与。 – 2013-03-19 10:30:54