Estoy escribiendo una aplicación de WPF y quiero utilizar las anotaciones de datos para especificar cosas como Required
campos, Range
, etc.DataAnnotations combinando y IDataErrorInfo para WPF
Mis clases ViewModel utilizar la interfaz normal INotifyPropertyChanged
y puedo validar la todo el objeto con suficiente facilidad usando C# 4 Validator
, pero también me gustaría que los campos resalten en rojo si no se validan correctamente. Encontré esta publicación en el blog aquí (http://blogs.microsoft.co.il/blogs/tomershamam/archive/2010/10/28/wpf-data-validation-using-net-data-annotations-part-ii.aspx) que habla sobre cómo escribir su modelo de vista base para implementar IDataErrorInfo
y simplemente usar el Validator, pero la implementación no se compila realmente ni puedo ver cómo funcionaría. El método en cuestión es la siguiente:
/// <summary>
/// Validates current instance properties using Data Annotations.
/// </summary>
/// <param name="propertyName">This instance property to validate.</param>
/// <returns>Relevant error string on validation failure or <see cref="System.String.Empty"/> on validation success.</returns>
protected virtual string OnValidate(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
{
throw new ArgumentException("Invalid property name", propertyName);
}
string error = string.Empty;
var value = GetValue(propertyName);
var results = new List<ValidationResult>(1);
var result = Validator.TryValidateProperty(
value,
new ValidationContext(this, null, null)
{
MemberName = propertyName
},
results);
if (!result)
{
var validationResult = results.First();
error = validationResult.ErrorMessage;
}
return error;
}
El problema es GetValue
no se proporciona. Podría estar hablando del GetValue
que aparece cuando hereda DependencyObject
, pero la sintaxis aún no funciona (espera que pase DependencyProperty
como parámetro) pero estoy usando propiedades regulares de CLR con OnPropertyChanged("MyProperty")
que se invoca en el setter.
¿Hay una buena manera de conectar la validación a la interfaz IDataErrorInfo
?
Esto es más o menos lo que terminé haciendo, pero no funcionará si tiene propiedades de dependencia en el Modelo de Vista, así que tiene que probar en ambos sentidos. No es tan elegante como esperaba, pero a veces es lo que tienes que hacer. –