C# 通过视图模型图/树进行验证
我的问题要求我根据一些依赖关系验证视图模型中的各个字段。我使用Silverlight、Prism和MVVM 例如(与我的真实场景不同): 每艘船可以有许多集装箱,一个集装箱可以有许多物品 每个类都继承自C# 通过视图模型图/树进行验证,c#,silverlight,mvvm,prism,C#,Silverlight,Mvvm,Prism,我的问题要求我根据一些依赖关系验证视图模型中的各个字段。我使用Silverlight、Prism和MVVM 例如(与我的真实场景不同): 每艘船可以有许多集装箱,一个集装箱可以有许多物品 每个类都继承自NotificationObject,并在属性更改时调用RaisePropertyChanged 我的业务规则是确保当Ship.TypeId属性等于1时,Item.color、Item.Name和Item.Size不为空。如果Ship.TypeId等于任何其他值,则不需要验证项中的属性 此时,正
NotificationObject
,并在属性更改时调用RaisePropertyChanged
我的业务规则是确保当Ship.TypeId属性等于1时,Item.color、Item.Name和Item.Size不为空。如果Ship.TypeId等于任何其他值,则不需要验证项中的属性
此时,正在OnPropertyChanged
事件的视图模型中执行验证
我面临的问题是,如果我在Item类中添加验证,那么对象就不知道Ship.TypeId。如果我订阅了由项目和容器抛出的PropertyChanged
事件,我可以从Ship中检测属性更改,但只能获取属性名称(相对于子类,即名称),而不能获取旧值或新值
我想能够做的是验证子项,同时知道Ship.TypeId是,并且知道哪个名称、颜色或大小属性已更改,并且能够针对UI上的正确字段引发错误
非常感谢,,
Adrian正如您所指出的,由于
项目
对船舶
一无所知,因此它不应该进行涉及船舶的验证。也许可以向项
添加一个属性,使其能够在本地进行验证(例如CanBeEmpty
),但如果不知道更多信息,我就不能说这是否有意义
您没有指定编辑所采用的格式,因此很难进行评论。如果可以在同一屏幕上实时编辑装运和项目,则编辑项目或编辑装运可能会导致验证失败。在这种情况下,我通常会推迟验证,直到通过单击OK或其他方式提交所有编辑。当你被迫在任何时候都保持内容的有效性时,编辑多个内容会变得非常令人沮丧
如果您只能独立于ships编辑项目,并且项目本身的额外属性没有意义,那么我建议将您的项目包装在一个了解ships的ItemEditViewModel中。这似乎是合理的,因为创建有效的项目编辑需要了解船舶信息,因此在这样的编辑屏幕中查看模型也需要了解船舶信息。您使用的是IDataErrorInfo吗?我使用的是
INotifyDataErrorInfo
,我正在使用的NotificationObject
类似乎有一个自定义的AddError
方法,可以将错误添加到字典中。为什么需要旧值?我真的不需要旧值,新值也一样好。如果我使用PropertyChangedEventArgs
,那么我只能访问PropertyName
属性,如果该属性包含“Name”,则可能属于许多项中的任何一项(或具有“Name”属性的未来对象)。我不确定如何识别引发事件的项对象实例中的哪个。您可以通过将PropertyChanged事件的发件人对象强制转换为适当的类型来查找已更改的项。谢谢。它们都可以在同一屏幕上编辑。这是我继承的一个系统,当前的风格是在ViewModel中进行验证。正如我们在这里讨论的,当项目
对发货一无所知时,会引发其他问题。我想我会选择提交时验证选项。