Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 在自定义渲染器中,何时应使用SetValueFromRenderer?_Xamarin_Xamarin.forms - Fatal编程技术网

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

Xamarin 在自定义渲染器中,何时应使用SetValueFromRenderer?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,此处的文档: $Xamarin.Forms.IElementController.SetValueFromRenderer/p/Xamarin.Forms.BindableProperty/System.Object/ 简单地说: 在不破坏绑定属性上的绑定的情况下,从渲染器设置值 Setter调用也如下所示: set { ((IElementController)this).SetValueFromRenderer(TheProperty, value); } 但我不清楚它提供了什么?我正在查

此处的文档:

$Xamarin.Forms.IElementController.SetValueFromRenderer/p/Xamarin.Forms.BindableProperty/System.Object/

简单地说:

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

Setter调用也如下所示:

set { ((IElementController)this).SetValueFromRenderer(TheProperty, value); }
但我不清楚它提供了什么?我正在查看Xamarin.Forms中github上的一些代码,我看到这些代码被频繁使用,所以我想更好地了解它的用途和正确用法。

请查看。基本上,您希望使用它从自定义渲染器设置Xamarin Forms控件的属性,而不是直接设置控件的属性。如果控件的属性具有单向绑定,则直接从自定义呈现程序设置它可能会破坏该绑定

在普通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");
    }
}