c# - 通过 View 模型图/树进行验证

标签 c# silverlight mvvm prism

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

作为示例(与我的实际情况有所不同):

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

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

我的业务规则是确保在属性Ship.TypeId等于1时,Item.Colour,Item.Name和Item.Size不为空。如果Ship.TypeId等于其他任何值,则无需验证项目中的属性。

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

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

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

非常感谢,
阿德里安

最佳答案

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

您没有指定编辑采用的格式,因此很难注释。如果可以在同一屏幕上实时编辑船和物品,则通过编辑物品或编辑船使验证失败。在这种情况下,我通常将验证推迟到通过单击“确定”或其他操作提交所有编辑之后。当您被迫一直保持有效时,对多个内容进行编辑确实令人沮丧。

如果您只能编辑与船隔绝的物品,而Item本身的多余属性没有意义,那么我建议将您的物品包装在一个了解船的ItemEditViewModel中。这似乎是合理的,因为创建有效的项目编辑需要船舶知识,因此在这种编辑屏幕中的ViewModels也需要船舶知识。

关于c# - 通过 View 模型图/树进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10205377/

相关文章:

silverlight - Silverlight 中的菜单控件

wpf - 将WPF项目转换为Silverlight?找不到System.Windows.UIElement引用

wpf - wpf数据网格中的绑定(bind)组合框

c# - ILDASM和ILASM,怎么用?

c# - 在 switch 语句中我们可以在 C# 中使用枚举吗

c# - 如何在 kinect 中实现挥手手势?

c# - 保持套接字打开一次并多次发送/接收消息

silverlight - 使用 Silverlight 文本框在插入符号位置插入

c# - Silverlight Prism : How to maintain views in a specific order inside a region

c# - WPF Caliburn.Micro/mvvm 导航