Я добавил ValidateValueCallback к DependencyProperty по имени A. Теперь в проверить обратном вызове, A должен сравниться со значением DependencyProperty по имени B. Но как получить доступ к значению B в статическом методе ValidateValueCallback validateValue (возразите значению)? Спасибо за любую подсказку!
Пример кода:
class ValidateTest : DependencyObject
{
public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(), validateValue);
public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest));
static bool validateValue(object value)
{
// Given value shall be greater than 0 and smaller than B - but how to access the value of B?
return (double)value > 0 && value <= /* how to access the value of B ? */
}
}
Обратные вызовы валидации используются в качестве проверки вменяемости заданного входного значения по набору статических ограничений. В вашем обратном вызове проверки проверка на положительное значение является правильным использованием проверки, но проверка на другое свойство - нет. Если вам нужно, чтобы заданное значение было меньше, чем зависимое свойство, вам следует использовать property 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);
}