Я использую для валидации вот такой класс:
public abstract class ViewModelBase : INotifyPropertyChanged, IDataErrorInfo
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly HashSet<string> PropertiesWithErrors = new HashSet<string>();
protected bool HasValidationErrors { get { return PropertiesWithErrors.Any(); } }
public string this[string propertyName] { get { return Validate(propertyName); } }
public string Error { get { throw new NotImplementedException(); } }
protected virtual string Validate(string propertyName)
{
var value = GetType().GetProperty(propertyName).GetValue(this);
var results = new List<ValidationResult>();
var context = new ValidationContext(this, null, null) { MemberName = propertyName };
if (!Validator.TryValidateProperty(value, context, results))
{
PropertiesWithErrors.Add(propertyName);
return results.First().ErrorMessage;
}
PropertiesWithErrors.Remove(propertyName);
return string.Empty;
}
protected virtual void RaisePropertyChanged(string pname) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pname));
protected virtual void Set<T>(string pname, ref T field, T value)
{
field = value;
RaisePropertyChanged(pname);
}
}
Нужно только отнаследовать от него ViewModel и создать свойство для биндинга. Это очень удобно, т.к. сразу ясно есть ли ошибки валидации. Но у меня такая проблема. Если у меня свойство типа double то у меня полностью перестают вводиться точки и запятые. Как же мне поставить дробную точку (или запятую)?
Ну например:
public class ViewModel : ViewModelBase
{
public double Value { get; set; }
}
<TextBox Text="{Binding Path=Value, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
Кроме того при работе с этой ViewModel-ю перестают работать всякие полезные атрибуты из System.ComponentModel.DataAnnotations аля Range и т.п. Почему так происходит?