2017-07-15 40 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"); 

}