通过视图模型图/树验证

时间:2012-04-18 08:07:52

标签: c# silverlight mvvm prism

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

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

Simple class example

每艘船可以有很多容器,一个容器可以有很多物品。

每个类都继承自NotificationObject,并在每次更改属性时调用RaisePropertyChanged

我的业务规则是确保 Item.Colour Item.Name Item.Size 在属性<时不为空em> Ship.TypeId 等于1.如果 Ship.TypeId 等于其他任何内容,我不需要验证 Item 中的属性。< / p>

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

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

我希望能够做的是验证子项目,同时知道 Ship.TypeId ,并且还知道哪个名称颜色大小属性已更改,并且能够针对UI上的正确字段引发错误。

非常感谢, 阿德里安

1 个答案:

答案 0 :(得分:2)

正如您所指出的,由于ItemShip一无所知,因此不应该进行涉及Ships的验证。有可能向Item添加一个可以在本地验证的属性(例如CanBeEmpty),但如果不知道更多,我就无法说这是否有意义。

您没有指定编辑采用的格式,因此很难发表评论。如果可以在同一屏幕上实时编辑船舶和物品,则通过编辑项目或编辑船舶来验证是否失败。在这种情况下,我通常会推迟验证,直到通过单击“确定”或其他任何方式提交所有编辑。当你被迫在任何时候都保持有效时,编辑多件事会非常令人沮丧。

如果您只能单独编辑船只上的物品,并且物品本身的额外属性没有意义,那么我建议将物品包装在知道船只的ItemEditViewModel中。这似乎是合理的,因为创建有效的项目编辑需要了解船只,因此在这样的编辑屏幕中的ViewModel也需要了解船只。