如何在ViewModel上使用数据注释?

| 我正在将RIA Services与LinqToEntitiesDomainService <>和Silverlight 5 Beta结合使用,以在客户端生成DomainContext代码。我的模型/实体中有数据注释,可以进行基本的验证,而当直接使用模型时,诸如DataForm之类的控件可以直接进行验证。但是我将模型包装在ViewModel中,所以我失去了所有的自动验证功能。这是一个简化的示例:
// In DataModel assembly, regenerated on the client side by RIA Services 
public class PetModel 
{
    [Required]
    public string Name { get; set; }
}

// Only on the client side
public class PetViewmodel
{
    private PetModel _model;

    public PetViewmodel(PetModel model)
    {
        _model = model;
    }

    public string Name
    {
        get { return _model.Name; }
        set { _model.Name = value; }
    }
}
我的问题是:如何确保在客户端不将“ 1”视为“ 2”而不在ViewModel中复制所有注释? (将来我可能必须将这些实体与不同的ViewModels一起使用-我想保留相同的注释) 我想到了手动将
MetadataType
属性添加到ViewModel,指向Model类型:
[MetadataType(typeof(PetModel))]  
public class PetViewmodel
{
...
}
但是,a5在Silverlight 5版本ѭ6中不可用。 编辑:澄清-我实体的元数据包含在具有嵌套类的实体中。我手动编写此类,因为我的L2E模型在单独的程序集中,因此DomainService向导不会为我生成它。
[MetadataType(typeof(Metadata))]  
public partial class PetModel 
{
    [Required]
    public string Name { get; set; }

    public class Metadata 
    {
        [Required]
        public string Name { get; set; }
    }
}
如果我正确理解,这应该就是向导将如何生成元数据。 RIA Services代码生成器在客户端代码中生成正确的数据注释,因此可以正确地将其选中。     
已邀请:
我找到了一种方法。希望它对将来的人有所帮助: 我为执行验证的viewmodel使用了一个基类。在该基类上,我实现了
INotifyDataErrorInfo
,并且重写了
NotifyOfPropertyChange
方法(这是Caliburn.Micro的一部分,但是如果您不使用它,则可以轻松地将其附加到模型的
PropertyChanged
事件)。在事件处理程序中,我对该属性执行验证。在验证代码中,我使用反射来查找具有相同名称的属性,以及该属性上的任何验证属性(
RequiredAttribute
,ѭ12etc等)。然后,我使用这些属性中的值来验证更改后的属性上的新值,创建
ValidationResult
对象并将其添加到
List<ValidationResult>
中。如果所有\'local \'验证均通过,那么我将继续执行\'remote \'验证(即,需要与服务器交互的验证,例如检查唯一性)。 这是很多工作,但不幸的是,这(或类似的工作)是必要的。所有的MS示例似乎都不使用MVVM。我以为这只是为了使其简短/简单,但是MS的Silverlight团队在设计对象模型时似乎并未认真考虑MVVM。     

要回复问题请先登录注册