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

C# 如何在ViewModel上使用数据注释?,c#,mvvm,data-annotations,silverlight-5.0,C#,Mvvm,Data Annotations,Silverlight 5.0,我将RIA服务与LinqToEntitiesDomainService和Silverlight 5 Beta一起使用,在客户端生成DomainContext代码。我在模型/实体中有数据注释来执行基本验证,当直接使用模型时,诸如DataForm之类的控件会执行开箱即用的验证。但我正在将模型包装到ViewModel中,因此我丢失了所有自动验证。以下是一个简化的示例: // In DataModel assembly, regenerated on the client side by RIA Ser

我将RIA服务与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; }
    }
}
我的问题是:如何确保
Name
在客户端被认为是
必需的
,而不复制ViewModel中的所有注释?(将来我可能不得不将这些实体与不同的ViewModel一起使用-我希望保留相同的注释)

我想手动向ViewModel添加
MetadataType
属性,指向模型类型:

[MetadataType(typeof(PetModel))]  
public class PetViewmodel
{
...
}
但是遗憾的是,
MetadataTypeAttribute
System.ComponentModel.DataAnnotations
的Silverlight 5版本中不可用

编辑:澄清-我的实体的元数据包含在具有嵌套类的实体中。我手动编写这个类,因为我的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服务代码生成器在客户端代码中生成正确的数据注释,因此它能够正确地提取数据。

我找到了一种方法。希望它能帮助将来的人:

我为执行验证的viewmodel使用了一个基类。在该基类上,我实现了
INotifyDataErrorInfo
,并重写了
NotifyOfPropertyChange
方法(这是方法的一部分,但如果不使用,则可以很容易地附加到模型的
PropertyChanged
事件)。在事件处理程序中,我对该属性执行验证。在验证代码中,我使用反射查找同名的属性以及属性上的任何验证属性(
RequiredAttribute
RangeAttribute
,等等)。然后,我使用这些属性中的值来验证更改属性上的新值,创建
ValidationResult
对象并将它们添加到
列表中。如果所有“本地”验证都通过,则我继续执行“远程”验证(即需要与服务器交互的验证,例如检查唯一性)


这是一个很大的工作,但不幸的是,这-或类似的东西-是必要的。所有MS示例似乎都没有使用MVVM。我以为这只是为了让它们简短,但微软的Silverlight团队在设计对象模型时似乎没有认真考虑MVVM。

你的域服务没有生成.meta.cs文件吗?@subt13:谢谢你的回复。我添加了一个澄清,回答了您的问题。您给了我一个想法:我认为如果我分离出元数据类并在客户机和服务器之间共享它们,我应该能够通过使用分部类而不是MetadataTypeAttribute在客户机上包含它们。我们拭目以待……很好,谢谢,我的设置与您相同,但我尝试从DomainService继承。代码非常庞大。抱歉,我不会发布50页的代码。