当另一个可绑定属性更改时,如何强制调用可绑定属性的coerceValue?

时间:2019-09-23 10:16:16

标签: xamarin xamarin.forms bindableproperty

我有一个这样的自定义控件:

<select onchange="changebyteintoselectedValue(123123123)">
  <option value="KB">KB</option>
  <option value="MB">MB</option>
  <option value="GB">GB</option>
  <option value="TB">TB</option>
</select>

这是<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吗?

1 个答案:

答案 0 :(得分:0)

  

问题在于,只有在“值”更改时才会得到评估,这将不起作用:

这是预期结果。方法Clamp将返回限制在最小值和最大值之间的值。

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将被称为。