Как заставить вызывать coerceValue связываемого свойства при изменении другого связываемого свойства? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть пользовательский элемент управления, подобный этому:

<controls:CustomControl Value=".8" MaxValue=".7"/>

это свойство привязки Value:

public static readonly BindableProperty ValueProperty =
            BindableProperty.Create(nameof(Value), typeof(double), typeof(CustomControl), 2d,
                coerceValue: (bindable, value) =>
                 ((double)value).Clamp(0.05d, ((CustomControl)bindable).MaxValue));

Проблема в том, что он оценивается только тогда, когда Valueизменяется, это не сработает:

<controls:CustomControl Value=".8" MaxValue=".7"/>

Но это будет:

<controls:CustomControl MaxValue=".7" Value=".8"/>

нет способа выполнить coerceValue при изменении другого свойства (т. е. вего propertyChanged)?

1 Ответ

0 голосов
/ 23 сентября 2019

Проблема в том, что он оценивается только при изменении значения, это не будет работать:

Это ожидаемый результат.Метод Clamp вернет значение, ограниченное включенным диапазоном min и max.

template<class T>
T Clamp(T x, T min, T max)
{
    if (x > max)
        return max;
    if (x < min)
        return min;
    return x;
}

Когда вы установите Value как 0,7 и MaxValue как 0,8, потому что 0,7 больше, чем 0,05 именьше 0,8, поэтому он вернется сам (0,7).И метод propertyChanged никогда не будет вызван.

Когда вы установите Value в 0,8, а MaxValue в 0,7, он вернет 0,8.И будет вызываться метод propertyChanged.

...