在自定义渲染器中,何时应使用SetValueFromRenderer?

时间:2017-06-22 14:37:29

标签: xamarin xamarin.forms

此处的文档:

https://developer.xamarin.com/api/member/Xamarin.Forms.Element $ Xamarin.Forms.IElementController.SetValueFromRenderer / P / Xamarin.Forms.BindableProperty / System.Object的/

简单说明:

  

在不破坏绑定属性绑定的情况下,从渲染器设置值。

Setter调用也是这样的:

set { ((IElementController)this).SetValueFromRenderer(TheProperty, value); }

但我不清楚它提供了什么?我正在浏览Xamarin.Forms中的github上的一些代码,我发现它经常被使用,所以我想更好地理解它的目的和正确使用。

1 个答案:

答案 0 :(得分:2)

结帐Eric's answer。基本上,您将希望使用它来自定义渲染器设置Xamarin Forms Control的属性,而不是直接设置Control的属性。如果您的Control的属性具有OneWay绑定,则直接从自定义渲染器设置它可能会破坏该绑定。

同样的事情发生在普通的XF ContentPage中。如果我执行以下操作,则绑定将被第二个赋值覆盖:

Entry entry = new Entry();

entry.SetBinding(Entry.TextProperty, "EntryText"); //Binding is set and good

entry.Text = "blah"; //Binding is overwritten with my hard coded "blah" value

示例

为:

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

    if (e.PropertyName == Entry.TextProperty.PropertyName) {
        Element.Text = "Overwritten";
    }
}

好:

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

    if (e.PropertyName == Entry.TextProperty.PropertyName) {
        ((IElementController)Element).SetValueFromRenderer(Entry.TextProperty, "Overwritten");
    }
}