Класс данных:
Код: Выделить всё
public class MyAwesomeClass : IDataErrorInfo, INotifyPropertyChanged{
string _Name;
public string Name { get { return _Name; } set { if(Name is null || !Name.Equals(value)) { _Name = value; Changed(nameof(Name)); } } }
int _MyVal;
[CustomValidation(typeof(MyAwesomeValidator), nameof(MyAwesomeValidator.ValidateIntVal))]
public int MyVal { get { return _MyVal; } set { if(!MyVal.Equals(value)) { _MyVal = value; Changed(nameof(MyVal)); } } }
private void Changed(string property) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); }
//Nicked from: https://reza-aghaei.com/dataannotations-validation-attributes-in-windows-forms/
[Browsable(false)]
public string this[string property]
{
get
{
var propertyDescriptor = TypeDescriptor.GetProperties(this)[property];
if (propertyDescriptor == null)
return string.Empty;
var results = new List();
var result = Validator.TryValidateProperty(
propertyDescriptor.GetValue(this),
new ValidationContext(this, null, null)
{ MemberName = property },
results);
if (!result)
return results.First().ErrorMessage;
return string.Empty;
}
}
[Browsable(false)]
public string Error
{
get
{
var results = new List();
var result = Validator.TryValidateObject(this,
new ValidationContext(this, null, null), results, true);
if (!result)
return string.Join(Environment.NewLine, results.Select(x => x.ErrorMessage));
else
return null;
}
}
public static IEnumerable DummyData {get{return new []{
new MyAwesomeClass("a",-2),
new MyAwesomeClass("b",3),
new MyAwesomeClass("c",8)
};}}
}
Код: Выделить всё
public class CustomValidationResult : ValidationResult {
public enum ResultState { Warning, Error}
public ResultState State {get; private set;}
public CustomValidationResult(string errorMessage, ResultState state):base(errorMessage) {
ResultState = state;
}
public static ValidationResult Success {get{return ValidationResult.Success;}}
}
Код: Выделить всё
public class MyAwesomeValidator{
public static ValidationResult ValidateIntVal(int value, ValidationContext Context) {
if(value < 0) return new CustomValidationResult("The value cannot be smaller than 0", CustomValidationResult.ResultState.Error);
if(value