Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate data using DataAnnotations with WPF & Entity Framework?

Is there any way to validate using DataAnnotations in WPF & Entity Framework?

like image 483
Shimmy Weitzhandler Avatar asked Nov 18 '09 11:11

Shimmy Weitzhandler


People also ask

What is WPF data validation?

Syncfusion WPF input controls allow you to validate user input and display hints if validation fails. If the user input is invalid, a default red border will be shown around the UIElement.

What is the use of using system ComponentModel DataAnnotations?

Data annotations (available as part of the System. ComponentModel. DataAnnotations namespace) are attributes that can be applied to classes or class members to specify the relationship between classes, describe how the data is to be displayed in the UI, and specify validation rules.

What is DataAnnotations MVC?

DataAnnotations is used to configure your model classes, which will highlight the most commonly needed configurations. DataAnnotations are also understood by a number of . NET applications, such as ASP.NET MVC, which allows these applications to leverage the same annotations for client-side validations.


1 Answers

You can use the DataAnnotations.Validator class, as described here:

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

But if you're using a "buddy" class for the metadata, you need to register that fact before you validate, as described here:

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

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

[Added the following to respond to Shimmy's comment]

I wrote a generic method to implement the logic above, so that any object can call it:

// If the class to be validated does not have a separate metadata class, pass // the same type for both typeparams. public static bool IsValid<T, U>(this T obj, ref Dictionary<string, string> 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<ValidationResult>();     Validator.TryValidateObject(obj, validationContext, validationResults, true);      if (validationResults.Count > 0 && errors == null)         errors = new Dictionary<string, string>(validationResults.Count);      foreach (var validationResult in validationResults)     {         errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage);     }      if (validationResults.Count > 0)         return false;     else         return true; } 

In each object that needs to be validated, I add a call to this method:

[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<string, string> errors)     {         return this.IsValid<Employee, Metadata>(ref errors);         //If the Employee class didn't have a buddy class,         //I'd just pass Employee twice:         //return this.IsValid<Employee, Employee>(ref errors);     } } 
like image 107
Jeremy Gruenwald Avatar answered Oct 07 '22 20:10

Jeremy Gruenwald