BindableProperty通知属性已更改

时间:2016-07-21 07:50:13

标签: c# xamarin xamarin.forms

在自定义ContentView上,我创建了一个BindableProperty,就像这样

public static readonly BindableProperty StrokeColorProperty = 
    BindableProperty.Create("StrokeColor", 
                            typeof(Color), 
                            typeof(SignaturePadView), 
                            Color.Black, 
                            BindingMode.TwoWay);

但是我必须通知属性更改,因为我必须在自定义渲染器中读取属性,我该怎么做?
如果我在PropertyChanged上为BindableProperty设置它是一个静态方法,那么我就不能这样做了:(

2 个答案:

答案 0 :(得分:4)

BindableProperty的PropertyChanged事件处理程序确实是静态的,但其上的输入参数是

BindingPropertyChangedDelegate<in TPropertyType>(BindableObject bindable, TPropertyType oldValue, TPropertyType newValue);

如您所见,第一个输入参数将是BindableObject。您可以安全地将bindable强制转换为自定义类,并获取属性已更改的实例。像这样:

public static readonly BindableProperty StrokeColorProperty = 
    BindableProperty.Create("StrokeColor", 
                            typeof(Color), 
                            typeof(SignaturePadView), 
                            Color.Black, 
                            BindingMode.TwoWay,
propertyChanged: (b, o, n) =>
                {
                    var spv = (SignaturePadView)b;
                    //do something with spv
                    //o is the old value of the property
                    //n is the new value
                });

这显示了在属性被decalred的共享代码中捕获属性更改的正确方法。如果您在本机项目中有自定义渲染器,则它的OnElementPropertyChanged事件触发,其中“StrokeColor”作为PropertyName,有或没有将此propertyChanged委托提供给BindableProperty定义。

答案 1 :(得分:0)

在渲染器上覆盖OnElementPropertyChanged方法:

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if(e.PropertyName=="StrokeColor")
            DoSomething();
    }