Esiste un modo per convalidare utilizzando DataAnnotations in WPF & Entity Framework?Convalidare i dati utilizzando DataAnnotations con WPF & Entity Framework?
risposta
È possibile utilizzare le NoteAnnotazioni.classe di convalida, come descritto qui:
Ma se si sta utilizzando una classe "compagno" per i metadati, è necessario 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<ValidationResult> results = new List<ValidationResult>();
ValidationContext context = new ValidationContext(myEntity, null, null)
bool valid = Validator.TryValidateObject(myEntity, context, results, true);
[aggiunto il seguente per rispondere al commento di Shimmy]
Ho scritto un metodo generico per implementare la logica di cui sopra, in modo che qualsiasi oggetto può chiamare:
// 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 ogni oggetto 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<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);
}
}
Utilizzare una "classe compagno". Numero 4 in this how-to.
Il collegamento che hai fornito non è applicativo in WPF, penso di averlo menzionato nel mio post. – Shimmy
Penso che ciò che manca alla risposta di Craigs è come verificare effettivamente se ci sono errori di validazione. Questo è DataAnnotation convalida corridore scritto da Steve Sanderson per chi vuole correre controllo di convalida a livello di deferente poi di presentazione (http://blog.codeville.net/category/xval/, il codice è in progetto di esempio):
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);
}
io non sono a conoscenza di WPF (non è sicuro se c'è una soluzione pronta per te per la 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 convalida, ma non ha mai fallito.
In WPF, deve essere attivato per modifica della proprietà. – Shimmy
Questo è un modo interessante per realizzarlo - Potrei rivedere la mia versione (sopra) con alcune di queste idee. –
ho avuto la stessa domanda ed ha trovato le seguenti idee:
- Notification Pattern
- Una porta di controllo DataForm di Silverlight per WPF in CodePlex
In .NET 4, v'è il supporto di convalida in Entity-Framework che utilizza questa estensione, controlla: http://blogs.msdn.com/adonet/archive/2010/01/13/introducing-the-portable-extensible-metadata.aspx
Non sono sicuro se utilizza Dati Annotazioni tho.
UPDATE
ho provato con VB.NET e non ha funzionato, penso che supporta solo i progetti C#.
ho scritto un validatore basato collaboratore che include un collaboratore convalida DataAnnotation e anche controlli contro attacchi rotti (in cui l'utente ha immesso tipo non corretto)
http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/
Dimentichi che stavo parlando di oggetti entità generati da edm designer. – Shimmy
Potresti essere interessato alla BookLibrary applicazione di esempio del WPF Application Framework (WAF). Fa esattamente quello che stai chiedendo: using DataAnnotations in WPF & Entity Framework.
- 1. Utilizzo di DataAnnotations con Entity Framework
- 2. Ottenere Lunghezza dati con Entity Framework (per convalidare le lunghezze di dati su un servizio WCF)
- 3. Entity Framework Aggiorna dati
- 4. Entity Framework ObjectContext nell'applicazione windows/WPF/Silverlight
- 5. Best practice per l'utilizzo di Entity Framework con WPF DataBinding
- 6. Reporting Services utilizzando Entity Framework
- 7. Entity Framework con i trigger invece di
- 8. Entity Framework 5.0 in codice prima con MySQL in WPF
- 9. Interrogazione dei dati utilizzando Entity Framework dalla tabella creata dinamicamente
- 10. Migliorare l'efficienza con Entity Framework
- 11. come caricare/visualizzare immagini utilizzando ASP.net MVC4 con Entity Framework
- 12. Entity Framework Inserimento dati iniziali su Ricostruzione
- 13. Associazione dati su più finestre con WPF/Entity Framework? Passare contesto o no?
- 14. Come crittografare i dati in Entity Framework Code Innanzitutto?
- 15. Ottenere dati dalla stored procedure con Entity Framework
- 16. Entity Framework Design - Multiple "Views" per i dati
- 17. autoreferenziale con Entity Framework
- 18. Unicode con Entity Framework
- 19. SQLite con Entity Framework
- 20. Entity Framework + POCO
- 21. Come riutilizzare le query di Entity Framework (utilizzando i metodi)?
- 22. Utilizzando Entity Framework per copiare entità tra i database
- 23. Entity Framework filtra i dati per stringa sql
- 24. Entity Framework 4.3 Migrazioni spostano i dati esistenti
- 25. Annotazioni di dati con Entity Framework 5.0 (primo database)
- 26. DataContractSerializer errore utilizzando Entity Framework 4.0 con WCF 4.0
- 27. Come risolvere i conflitti di confronto con Entity Framework?
- 28. ADO.NET Entity Framework con OLE DB Accesso origine dati
- 29. Entity Framework con un grande progetto
- 30. Come convalidare PasswordBox WPF
Ho classi gazillion correlate a MD, hai qualche idea su come associarlo al MD in modo dinamico, ma voglio farlo su richiesta, cioè solo quando sto per usare questa classe (o la sua validazione) e solo una volta. – Shimmy
@Shimmy: vedere sopra. –
grazie! BTW, non c'è bisogno di contrassegnare il dizionario come 'ref', dal momento che non cambierete comunque il riferimento, basta accedere alle sue proprietà. – Shimmy