【问题标题】:Xamarin BindableProperty doesn`t call setterXamarin BindableProperty 不调用 setter
【发布时间】:2020-07-21 08:17:26
【问题描述】:

我的自定义组件中的 Uri 属性有问题

我的自定义 WebView 组件:

public class PdfWebView : WebView
{ 
    public static readonly BindableProperty UriProperty = BindableProperty.Create(nameof(Uri), typeof(string), typeof(PdfWebView), default(string), propertyChanged: OnUriPropertyChanged);

    private static void OnUriPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if(oldValue != newValue)
        {

        }
    }

    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); } // need call but it`s doesnt work
    }
}

XAML:

<controls:PdfWebView
            x:Name="PdfView"
            Uri="{Binding Uri}"
            IsVisible="{Binding IsLoaderVisible, Converter={StaticResource BoolReverseConverter}}"
            Margin="0"
            HorizontalOptions="FillAndExpand"
            VerticalOptions="FillAndExpand"
            Navigated="WebView_Navigated"/>

渲染器:

[assembly: ExportRenderer(typeof(PdfWebView), typeof(PdfWebViewRenderer))]
namespace Contrinex.Droid.Renderers
{
    public class PdfWebViewRenderer : WebViewRenderer
    {
        public PdfWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                Control.Settings.JavaScriptEnabled = true;
                Control.Settings.AllowFileAccess = true;
                Control.Settings.AllowFileAccessFromFileURLs = true;
                Control.Settings.AllowUniversalAccessFromFileURLs = true;
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == PdfWebView.UriProperty.PropertyName)
            {
                var docView = Element as PdfWebView;
                Control.LoadUrl($"file:///android_asset/pdfjs/web/viewer.html?file={($"file:///{docView.Uri.Trim('/')}")}");
            }
        }
    }
}

Uri 属性中的值已更改,但 setter 不调用

【问题讨论】:

  • 也发布 ViewModel 代码。顺便说一句,如果初始值和新值相同,则不会调用 SetValue。
  • BindableProperty 没有设置还是没有调用setter?从 XAML 分配可绑定属性时,不会调用 setter,但仍会设置 UriProperty
  • @Espi4U 有什么更新吗?

标签: c# .net xamarin.forms .net-core xamarin.android


【解决方案1】:

根据你的描述,你的意思是你改变了Uri属性,但是PdfWebview中的BindableProperty UriProperty没有改变。

如果是,请在 Rebder 中添加 OnElementPropertyChanged 方法,如下所示:

 protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        PdfWebView pdfWebView = sender as PdfWebView;
        if (e.PropertyName == "Uri")
        {
            Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfWebView.Uri))));
        }
    }

webview渲染的完整代码:

public  class PdfWebViewRenderer: WebViewRenderer
{
    public PdfWebViewRenderer(Context context) : base(context)
    {

    }

    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)

        {

            var pdfView = Element as PdfWebView;

            Control.Settings.AllowUniversalAccessFromFileURLs = true;

            Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfView.Uri))));

        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        PdfWebView pdfWebView = sender as PdfWebView;
        if (e.PropertyName == "Uri")
        {
            Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfWebView.Uri))));
        }
    }
}

截图:

【讨论】:

    猜你喜欢
    • 2017-12-27
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多