强制BindableProperty属性更改为即使Xamarin表单中的值相同也可以触发

时间:2018-09-15 11:49:20

标签: xamarin.forms binding

我在自定义控件(HealthBar)中有一个可绑定的属性:

    public static readonly BindableProperty ValueProperty = BindableProperty.Create(
        nameof(Value),
        typeof(int),
        typeof(HealthBar),
        0,
        BindingMode.TwoWay,
        propertyChanged: ValueChanged);

即使我为属性设置了相同的值,是否也可以强制触发属性更改(ValueChanged方法)? ValueChanged方法正在进行一些计算以设置运行状况栏的宽度。

    private static void ValueChanged(BindableObject bindable, object oldValue, object newValue)
    {
        HealthBar obj = bindable as HealthBar;
        if (obj != null)
        {
            obj.RecalculateWidth();
        }
    }

我知道这听起来有点疯狂,所以这里有更多详细信息;我需要强制酒吧重新计算宽度,因为列表视图中有一些宽度,向ObservableCollection添加更多会导致宽度混乱。值每2秒通过signalR更新一次,因此,下次设置Value属性时,应该显示正确的宽度。

以下是为清楚起见重新计算宽度的代码:

    private void RecalculateWidth()
    {
        double val = this.Value;
        double max = this.Max;

        double percent = (val / max) * 100;
        double width = (double)this.Width * (double)percent / 100;
        this.bar.Layout(new Rectangle(0, 0, width, this.Height));
    }

1 个答案:

答案 0 :(得分:0)

基于为RecalculateWidth()发布的代码-如果ValueMax的值未更改,则除非this.Width强制执行属性更改处理是无济于事的(父控件HealthBar的)已更改。

因此,基本上,您要做的是每次父控件的宽度更改时重新计算子控件的宽度。

最简单的方法是订阅更改:

protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    base.OnPropertyChanged(propertyName);

    if (propertyName == nameof(Width))
        this.RecalculateWidth();
}