2012-04-18 220 views
1

我的问题要求我根据一些依赖验证跨视图模型各个领域。我正在使用Silverlight,Prism和MVVM。验证通过视图模型图/树

为例(从我的现实世界中的场景改变):

Simple class example

每艘可拥有许多容器,容器可以有很多的项目。

每个类都从NotificationObject继承,每当属性发生更改时都会调用RaisePropertyChanged

我的业务规则,以确保Item.ColourItem.NameItem.Size不是空当地产Ship.TypeId等于1。如果Ship.TypeId等于别的,我不需要在项目来验证性能。

目前验证在OnPropertyChanged事件视图模型正在开展。

我所面临的问题是,如果我在项目类添加验证,那么该对象有没有的知识Ship.TypeId。如果我申请了项目甩出集装箱PropertyChanged事件,我可以检测从船舶内财产的变化,但只能获得属性名(相对于子类,即名称),但没有新的或旧值。

我希望能够做的是验证子项,同时明知Ship.TypeId的,也知道哪一个名称颜色尺寸属性发生变化,并能在用户界面上针对正确的字段提出错误。

非常感谢, 阿德里安

+0

你在使用IDataErrorInfo吗? – 2012-04-18 08:17:08

+0

我正在使用'INotifyDataErrorInfo',它看起来好像我正在使用的'NotificationObject'类有一个自定义的'AddError'方法,它将错误添加到字典中。 – 2012-04-18 08:19:39

+0

为什么你需要旧的价值观? – GazTheDestroyer 2012-04-18 10:43:38

回答

2

正如你所指出的,由于Item不知道一个Ship任何东西,它不应该做的是涉及船舶验证。这可能是可以将属性添加到Item,它使人们有可能在本地验证(例如CanBeEmpty),但不知道更多的我不能说是否会是有意义的。

不指定编辑采用什么格式,所以很难评论。如果船舶和物品都可以在同一个屏幕上进行实时编辑,那么通过编辑物品或编辑船只可以使验证失败。在这种情况下,我通常推迟验证,直到通过单击“确定”或其他操作提交所有编辑。当你被迫随时保持有效时,编辑多件事情会让你非常沮丧。

如果您只能编辑从船上孤立的项目,并在项目的额外的属性本身没有什么意义的话,我会建议在ItemEditViewModel,它知道包裹船舶您的项目。这似乎是合理的,因为创建有效的项目编辑需要船只的知识,所以ViewModels在这样的编辑屏幕上也需要船只的知识。

+0

谢谢。它们都在同一个屏幕上可编辑。这是我继承的系统,目前的风格是在ViewModel中验证。正如我们在这里介绍的那样,当'Items'对'Ships'一无所知时,就会引发其他问题。我想我会去提交*验证提交*选项。 – 2012-04-18 11:57:17