Convalidare i dati usando DataAnnotations con WPF & Entity Framework?

C’è un modo per convalidare usando DataAnnotations in WPF & Entity Framework?

È ansible utilizzare la class DataAnnotations.Validator, come descritto qui:

http://johan.driessen.se/archive/2009/11/18/testing-dataannotation-based-validation-in-asp.net-mvc.aspx

Ma se stai usando una class “buddy” per i metadati, devi registrare questo fatto prima di convalidare, come descritto qui:

http://forums.silverlight.net/forums/p/149264/377212.aspx

TypeDescriptor.AddProviderTransparent( new AssociatedMetadataTypeTypeDescriptionProvider(typeof(myEntity), typeof(myEntityMetadataClass)), typeof(myEntity)); List results = new List(); ValidationContext context = new ValidationContext(myEntity, null, null) bool valid = Validator.TryValidateObject(myEntity, context, results, true); 

[Aggiunto quanto segue per rispondere al commento di Shimmy]

Ho scritto un metodo generico per implementare la logica sopra, in modo che qualsiasi object possa chiamarlo:

 // If the class to be validated does not have a separate metadata class, pass // the same type for both typeparams. public static bool IsValid(this T obj, ref Dictionary errors) { //If metadata class type has been passed in that's different from the class to be validated, register the association if (typeof(T) != typeof(U)) { TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T)); } var validationContext = new ValidationContext(obj, null, null); var validationResults = new List(); Validator.TryValidateObject(obj, validationContext, validationResults, true); if (validationResults.Count > 0 && errors == null) errors = new Dictionary(validationResults.Count); foreach (var validationResult in validationResults) { errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage); } if (validationResults.Count > 0) return false; else return true; } 

In ogni object che deve essere convalidato, aggiungo una chiamata a questo metodo:

 [MetadataType(typeof(Employee.Metadata))] public partial class Employee { private sealed class Metadata { [DisplayName("Email")] [Email(ErrorMessage = "Please enter a valid email address.")] public string EmailAddress { get; set; } } public bool IsValid(ref Dictionary errors) { return this.IsValid(ref errors); //If the Employee class didn't have a buddy class, //I'd just pass Employee twice: //return this.IsValid(ref errors); } } 

Penso che ciò che manca alla risposta di Craigs sia come verificare effettivamente se ci sono errori di validazione. Questo è il runner di convalida DataAnnotation scritto da Steve Sanderson per coloro che vogliono eseguire il controllo della validazione nel livello deferente e quindi nella presentazione ( http://blog.codeville.net/category/xval/ , il codice è nel progetto di esempio):

 public static IEnumerable GetErrors(object instance) { var metadataAttrib = instance.GetType().GetCustomAttributes (typeof(MetadataTypeAttribute), true). OfType().FirstOrDefault(); var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType(); var buddyClassProperties = TypeDescriptor.GetProperties (buddyClassOrModelClass).Cast(); var modelClassProperties = TypeDescriptor.GetProperties (instance.GetType()).Cast(); return from buddyProp in buddyClassProperties join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name from attribute in buddyProp.Attributes. OfType() where !attribute.IsValid(modelProp.GetValue(instance)) select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance); } 

Non ho familiarità con WPF (non sono sicuro che ci sia una soluzione pronta per te per la tua domanda), ma forse puoi usarla.

Inoltre, ci sono alcuni commenti sul suo blog che in alcuni casi non riesce a valutare correttamente la regola di validazione, ma non ha mai fallito.

Potresti essere interessato all’applicazione di esempio BookLibrary di WPF Application Framework (WAF) . Fa esattamente quello che stai chiedendo: usando DataAnnotations in WPF & Entity Framework.

Ho avuto la stessa domanda e ho trovato le seguenti idee:

  • Pattern di notifica
  • Una porta del controllo DataForm di Silverlight per WPF su CodePlex

Utilizzare una “class compagno”. Numero 4 in questo how-to .

Ho scritto un validatore basato su Contributor che include un contributore di convalida DataAnnotation e controlla anche i binding non funzionanti (dove l’utente ha inserito un tipo errato)

http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/

In .NET 4, esiste un supporto di convalida in Entity-Framework che utilizza questa estensione, consulta: http://blogs.msdn.com/adonet/archive/2010/01/13/introducing-the-portable-extensible-metadata. aspx

Non sono sicuro che usi DataAnnotation tho.

AGGIORNARE
Ho provato con VB.NET e non ha funzionato, penso che supporti solo i progetti C #.