Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过视图模型图/树进行验证_C#_Silverlight_Mvvm_Prism - Fatal编程技术网

C# 通过视图模型图/树进行验证

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等于任何其他值,则不需要验证项中的属性 此时,正

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

例如(与我的真实场景不同):

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

每个类都继承自
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中进行验证。正如我们在这里讨论的,当
项目
发货一无所知时,会引发其他问题。我想我会选择提交时验证选项。