Gibt es eine Möglichkeit zur Validierung mit DataAnnotations in WPF & Entity Framework?Daten mit DataAnnotations mit WPF & Entity Framework validieren?
Antwort
Sie können die DataAnnotations verwenden.Validator-Klasse, wie hier beschrieben:
Aber wenn man einen „Buddy“ Klasse für die Metadaten verwenden, müssen Sie diese Tatsache registrieren, bevor Sie bestätigen, wie hier beschrieben:
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);
[Hinzugefügt folgende Shimmy Kommentar antworten]
Ich schrieb eine generische Methode, die Logik oben zu implementieren, so dass jedes Objekt so nennen kann:
[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);
}
}
:
// 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 jedem Objekt, das validiert werden muss, ich einen Aufruf dieser Methode hinzufügen
Verwenden Sie eine "Buddy-Klasse". Nummer 4 in this how-to.
Der Link zur Verfügung gestellt ist nicht in WPF, ich glaube, ich erwähnte das in meinem Beitrag. – Shimmy
Ich denke, dass was von Craigs Antwort fehlt ist, wie man tatsächlich überprüft, ob es Validierungsfehler gibt. Dies ist DataAnnotation Validierung Läufer von Steve Sanderson für diejenigen geschrieben, die Validierungsprüfung in deferent Schicht dann Präsentation ausgeführt werden sollen (http://blog.codeville.net/category/xval/, ist der Code in Beispielprojekt):
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
var metadataAttrib = instance.GetType().GetCustomAttributes
(typeof(MetadataTypeAttribute), true).
OfType<MetadataTypeAttribute>().FirstOrDefault();
var buddyClassOrModelClass =
metadataAttrib != null ?
metadataAttrib.MetadataClassType :
instance.GetType();
var buddyClassProperties = TypeDescriptor.GetProperties
(buddyClassOrModelClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties
(instance.GetType()).Cast<PropertyDescriptor>();
return from buddyProp in buddyClassProperties
join modelProp in modelClassProperties
on buddyProp.Name equals modelProp.Name
from attribute in buddyProp.Attributes.
OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(instance))
select new ErrorInfo(buddyProp.Name,
attribute.FormatErrorMessage(string.Empty), instance);
}
ich mit WPF nicht vertraut bin (nicht sicher, wenn es eine Out-of-the-Box-Lösung für Ihre Frage gibt), aber vielleicht können Sie sie verwenden.
Es gibt auch einige Kommentare in seinem Blog, die in einigen Fällen Validierungsregel nicht richtig bewerten, aber es ist nie für mich gescheitert.
In WPF muss es pro Eigenschaftsänderung ausgelöst werden. – Shimmy
Dies ist ein interessanter Weg, um es zu erreichen - ich kann meine Version (oben) mit einigen dieser Ideen überarbeiten. –
ich die gleiche Frage hatte und fand folgende Ideen:
- Notification Pattern
- A-Port von Dataform Steuerelement WPF Silverlight auf CodePlex
In .NET 4 gibt es Validierungsunterstützung in Entity-Framework mit dieser Erweiterung, check out: http://blogs.msdn.com/adonet/archive/2010/01/13/introducing-the-portable-extensible-metadata.aspx
Ich bin mir nicht sicher, ob es Daten verwendet Anmerkungen tho.
UPDATE
Ich versuchte es mit VB.NET und es hat nicht funktioniert, ich denke, es nur Projekte C# unterstützt.
ich habe einen Profi-basierten Validator geschrieben, die eine DataAnnotation Validierung Beitrag enthält und prüft auch gegen gebrochene Bindungen
http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/
012 (in dem der Benutzer eine falsche Art eingegeben hat)Sie vergessen, dass ich über edm Designer generierte Entity-Objekte gesprochen habe. – Shimmy
Sie könnten in der Booklibrary Beispielanwendung des WPF Application Framework (WAF) interessiert. Es erfüllt genau das, wonach Sie fragen: Verwenden von DataAnnotations in WPF & Entity Framework.
- 1. Verwenden von DataAnnotations mit Entity Framework
- 2. Daten aktualisieren Entity Framework mit
- 3. Speichern complexa Daten mit Entity-Framework
- 4. Datenpersistenz mit Entity Framework
- 5. DataAnnotations oder manuell in Services validieren?
- 6. Entity Framework Daten aktualisieren
- 7. System.OutOfMemoryException mit Entity Framework?
- 8. Entity Framework - Wie Daten von Entity mit Namen laden
- 9. Async-Programmierung mit Entity Framework
- 10. Ansicht mit Entity Framework
- 11. Subquery mit Entity Framework
- 12. Unicode mit Entity Framework
- 13. C# WPF Entity Framework 6 Synchronisation Datenbanken
- 14. Sammlungswerte mit The Entity Framework?
- 15. Cache-Tabelle mit Entity-Framework
- 16. Anzeige einen Besetztanzeige, wenn Entity Framework Daten
- 17. Entity Framework 5.0 Code-zuerst mit MySQL in WPF
- 18. WPF TreeView, Entity Framework und HierarchicalDataTemplate mit verschachtelten untergeordneten Listen
- 19. Entity Framework speichert keine Daten
- 20. Entity Framework Daten lesen Leistung
- 21. Bedingte Assoziation mit Entity Framework
- 22. WPF mit MVVM und DataAnnotations, Validierungsfehler in einem Usercontrol
- 23. Blob-Eigenschaften mit Entity Framework 4 erstellen?
- 24. Entity Framework - Vererbung mit .Include?
- 25. Gridview mit Entity Framework sortieren.
- 26. Entity Framework Modell mit Remote
- 27. Entity Framework Joins mit NOLOCK
- 28. Wie InsertOrSelect mit Entity Framework
- 29. Synchronize Records mit Entity Framework
- 30. ASP.NET MVC mit Entity Framework
Ich habe eine gazillion Klassen im Zusammenhang mit MD, haben Sie eine gute Idee, wie Sie es mit der MD dynamisch verknüpfen, aber ich möchte es auf Nachfrage zu tun, dh nur wenn ich diese Klasse (oder Validierung) verwenden und nur einmal. – Shimmy
@Shimmy - siehe oben. –
danke! BTW, keine Notwendigkeit, das Wörterbuch als 'ref' zu markieren, da Sie die Referenz sowieso nicht ändern werden, greifen Sie einfach auf seine Eigenschaften zu. – Shimmy