Проверочные обратные вызовы используются в качестве проверок работоспособности для заданного входного значения по отношению к набору статических ограничений.В вашем обратном вызове проверки проверка на положительное значение является правильным использованием проверки, но проверка на другое свойство - нет.Если вам нужно убедиться, что заданное значение меньше зависимого свойства, вы должны использовать свойство coercion , например так:
public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(1.0, null, coerceValue), validateValue);
public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest), new PropertyMetaData(bChanged));
static object coerceValue(DependencyObject d, object value)
{
var bVal = (double)d.GetValue(BProperty);
if ((double)value > bVal)
return bVal;
return value;
}
static bool validateValue(object value)
{
return (double)value > 0;
}
Хотя это не вызовет исключения, если вы установитеA> B (как это делает ValidationCallback), это действительно желаемое поведение.Поскольку вы не знаете, в каком порядке установлены свойства, вы должны поддерживать свойства, установленные в любом порядке.
Нам также нужно указать WPF принудительно изменить значение свойства A, если значение B изменится, так как приведенное значение может измениться:
static void bChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(AProperty);
}