我在自定义控件(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));
}
答案 0 :(得分:0)
基于为RecalculateWidth()
发布的代码-如果Value
和Max
的值未更改,则除非this.Width
强制执行属性更改处理是无济于事的(父控件HealthBar
的)已更改。
因此,基本上,您要做的是每次父控件的宽度更改时重新计算子控件的宽度。
最简单的方法是订阅更改:
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == nameof(Width))
this.RecalculateWidth();
}