1

我的问题要求我根据某些依赖关系验证视图模型中的各个字段。我正在使用 Silverlight、Prism 和 MVVM。

作为一个例子(从我的真实世界场景改变):

简单的类示例

每艘船可以有很多集装箱,一个集装箱可以有很多物品。

每当更改属性时,每个类都会继承NotificationObject并调用。RaisePropertyChanged

我的业务规则是确保当属性Ship.TypeId等于 1时Item.ColourItem.NameItem.Size不为空。如果Ship.TypeId等于其他任何值,我不需要验证Item中的属性。

目前正在OnPropertyChanged事件的视图模型中进行验证。

我面临的问题是,如果我在Item类中添加验证,则该对象不知道Ship.TypeId。如果我订阅ItemContainerPropertyChanged抛出的事件,我可以从Ship中检测到属性更改,但只能获取属性名称(相对于子类,即 Name),但不能获取旧值或新值。

我想要做的是验证子项目,同时知道Ship.TypeId是并且还知道哪个NameColorSize属性已更改,并能够针对 UI 上的正确字段引发错误。

非常感谢,阿德里安

4

1 回答 1

2

正如您所指出的,由于Item对 a 一无所知Ship,因此不应进行涉及 Ships 的验证。可能可以添加一个属性Item,使其可以在本地进行验证(例如CanBeEmpty),但在不了解更多信息的情况下,我不能说这是否有意义。

您没有指定编辑采用什么格式,因此很难评论。如果船舶和物品都可以在同一屏幕上实时编辑,则通过编辑物品或编辑船舶使验证失败。在这种情况下,我通常会推迟验证,直到通过单击“确定”或其他方式提交所有编辑。当您被迫始终保持内容有效时,编辑多个内容真的很令人沮丧。

如果您只能在与船舶隔离的情况下编辑项目,并且 Item 本身的额外属性没有意义,那么我建议将您的项目包装在一个确实了解船舶的 ItemEditViewModel 中。这似乎是合理的,因为创建有效的项目编辑需要了解船舶,因此在这样的编辑屏幕中的 ViewModels 也需要了解船舶。

于 2012-04-18T11:07:11.383 回答