um eigene DataError Validierung durchzuführen, muß das Viewmodel
IDataErrorInfo implementieren - das ist ein INdexer auf das Viewmodel, dem als string der Properyname der zu validierenden Eigenschaft übergeben wird, und ein string mit validierungsmessage zurückgibt. null bedeutet kein Fehler.
Im Xaml müssen im Databinding
ValidatesOnDataErrors=True,
NotifyOnValidationError=True gesetz sein
IDataErrorInfo implementierung:
ganz einfach (in viewmodelbaseclass z.b.)
public virtual string this[string columnName] => null; // nothing to validate here
public virtual string Error => EditorResources.DefaultErrorMessage;
oder dann ausimplementiert:
public override string this[string columnName]
{
get
{
switch (columnName)
{
case nameof(MinNumericValue):
case nameof(MaxNumericValue):
return _validateMinMax(_doNumericValidation, MinNumericValue, MaxNumericValue);
case nameof(MinDecimalValue):
case nameof(MaxDecimalValue):
return _validateMinMax(_doDecimalValidation, MinDecimalValue, MaxDecimalValue);
case nameof(MinDateTimeValue):
case nameof(MaxDateTimeValue):
return _validateMinMax(_doDateTimeValidation, MinDateTimeValue, MaxDateTimeValue);
default:
return null;
}
}
}
die Propery Setter:
public int? MaxNumericValue
{
get => _maxNumericValue;
set
{
_maxNumericValue = value;
_doNumericValidation = true;
OnPropertyChanged();
OnPropertyChanged(nameof(MinNumericValue));
_doNumericValidation = false;
IsModified = true;
}
}
public int? MinNumericValue
{
get => _minNumericValue;
set
{
_minNumericValue = value;
_doNumericValidation = true;
OnPropertyChanged();
OnPropertyChanged(nameof(MaxNumericValue));
_doNumericValidation = false;
IsModified = true;
}
}
usw.
einfache Min Max Validierung:
private string _validateMinMax <T>(bool doValidation, T? min, T? max) where T: struct, IComparable<T>
{
if (!doValidation || null == min || null == max) return null;
if (0 >= min.Value.CompareTo(max.Value))
return null;
return EditorResources.MinMax_Validation;
}
auch gut:
https://www.codeproject.com/Tips/858492/WPF-Validation-Using-IDataErrorInfo