2017-07-15 41 views
2

除了我原来的帖子,我想我需要提到,我使用的是棱镜6.3。显然,编译器不喜欢添加到元数据类中的东西,它不在原始的部分中。不知道如何解决这个问题。 再次感谢...编辑获取最基本的MetaDataType的工作

好吧,我给,UNCLE!

我想添加数据注释到我的wpf实体框架应用程序。我已经尝试了6种方式,周日没有运气。我把我认为最简单的例子放在一起,并遵循所有的指示......没有任何工作。 在这里。 我有一个由EF(db第一个)生成的类。

namespace junk.DataModels 
{ 
    public partial class MyClass 
    { 
     public string SomeText { get; set; } 
    } 
} 

我有以下的局部类的另一个文件:

namespace junk.DataModels 
{ 
    [MetadataType(typeof(MyClassMetaData))] 
    public partial class MyClass 
    { 
    } 

    public partial class MyClassMetaData 
    { 
     private string _someText; 
     [Required(ErrorMessage = "Required")] 
     public string SomeText 
     { 
      get { return _someText; } 
      set { SetProperty(ref _someText, value); } 
     } 
    } 
} 

在我的ViewModel我定义:

private MyClass _mc; 
public MyClass MC 
{ 
    get { return _mc; } 
    set 
    { 
     SetProperty(ref _mc, value); 
    } 
} 

并在构造函数:

MC = new MC(); 
MC.SomeText = "Hello World."; 

最后,在我的xaml:

我有一个绑定控件:

<TextBox x:Name="txt" Text="{Binding MC.SomeText, 
     ValidatesOnDataErrors=True, 
     ValidatesOnExceptions=True, 
     ValidatesOnNotifyDataErrors=True, 
     UpdateSourceTrigger=PropertyChanged }" 
/> 

根据一切我读过,如果我跑这并清除文本框,我应该得到验证错误。我尝试了所有“ValidatesOn”的组合,它似乎没有什么区别。有人可以怜悯我,分享秘诀吗?我必须错过简单的东西。如果我绑定到metadataclass它的作品,但是这有点击败目的。

任何帮助将是伟大的!

+0

的可能的复制(https://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework ) – Haukinger

回答

0

尝试将以下静态构造函数添加到您的好友类“MyClass”。这将注册的元数据对你的EF类这样的验证可以找到数据注释:

static MyClass() 
{ 
    // Register the metadata against our EF data object. 
    // This will ensure the Validator find the annotations 
    TypeDescriptor.AddProviderTransparent(
     new AssociatedMetadataTypeTypeDescriptionProvider(
      typeof(MyClass), 
      typeof(MyClassMetaData)), 
      typeof(MyClass) 
    ); 
} 

您也可以尝试运行单元测试,以确认验证是否已使用您的注释,加入GUI的复杂性之前:[?使用具有WPF&实体框架DataAnnotations验证数据]

[TestMethod] 
public void TestAnnotations() 
{ 
    MyClass c = new MyClass(); 

    // Manually validate the MyClass object 
    List<ValidationResult> validationResults = new List<ValidationResult>(); 
    ValidationContext context = new ValidationContext(c, serviceProvider: null, items: null); 
    bool isValid = Validator.TryValidateObject(c, context, validationResults, validateAllProperties: true); 

    Assert.IsFalse(isValid, "Validation should fail because we didn't set SomeText"); 

}