DependencyProperty ValidateValueCallback вопрос

Я добавил ValidateValueCallback в DependencyProperty с именем A. Теперь в обратном вызове validate 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 ? */
    }
}

1 ответ

Решение

Валидационные обратные вызовы используются в качестве проверок работоспособности для заданного входного значения по отношению к набору статических ограничений. В вашем обратном вызове проверки проверка на положительное значение является правильным использованием проверки, а проверка на другое свойство - нет. Если вам нужно убедиться, что заданное значение меньше зависимого свойства, вы должны использовать приведение свойства следующим образом:

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);
}
Другие вопросы по тегам