You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms自定义渲染器赋值string[]到BindableProperty报错如何解决

问题根因

你收到的报错是因为混淆了BindableProperty标识符和实际属性值的存储逻辑:CameraView.clipsProperty是静态的绑定属性标识对象,类型为BindableProperty,本身不能直接赋值为字符串数组,你需要操作渲染器关联的CameraView实例的Clips属性完成赋值。
另外你当前的代码还有两个不符合规范的点:

  • 绑定属性字段命名应该遵循Pascal大小写规范,且要加readonly修饰符和其他绑定属性保持一致
  • 渲染器构造函数执行时还未关联到Xamarin.Forms层的CameraView实例,此时无法对共享视图的属性赋值,需要在OnElementChanged生命周期方法中操作实例

修正后的代码

1. CameraView 代码调整

namespace Project.Renderers
{
    public enum CameraOptions
    {
        Rear,
        Front
    }

    public class CameraView : View
    {
        public static readonly BindableProperty CameraProperty = BindableProperty.Create(nameof(Camera), typeof(CameraOptions), typeof(CameraView), CameraOptions.Rear);
        // 修正绑定属性命名,加readonly,添加双向绑定模式方便ViewModel接收变更
        public static readonly BindableProperty ClipsProperty = BindableProperty.Create(
            nameof(Clips), 
            typeof(string[]), 
            typeof(CameraView), 
            null,
            defaultBindingMode: BindingMode.TwoWay);

        public CameraOptions Camera
        {
            get { return (CameraOptions)GetValue(CameraProperty); }
            set { SetValue(CameraProperty, value); }
        }

        public string[] Clips
        {
            get { return (string[])GetValue(ClipsProperty); }
            set { SetValue(ClipsProperty, value); }
        }
    }
}

2. iOS 渲染器代码调整

[assembly: ExportRenderer(typeof(CameraView), typeof(CameraViewRenderer))]
namespace Project.iOS.Renderers
{
    public class CameraViewRenderer: ViewRenderer<CameraView, NativeCameraView>
    {
        NativeCameraView uiCameraPreview;

        protected override void OnElementChanged(ElementChangedEventArgs<CameraView> e)
        {
            base.OnElementChanged(e);
            
            if (Control == null)
            {
                // 初始化原生相机视图逻辑
                uiCameraPreview = new NativeCameraView();
                SetNativeControl(uiCameraPreview);
            }

            if (e.NewElement != null)
            {
                // 给原生相机注册录制完成的回调,录制完成后给共享视图的Clips赋值
                uiCameraPreview.OnRecordingFinished += (clipsPaths) => 
                {
                    // Element就是当前渲染器关联的Xamarin.Forms层CameraView实例
                    Element.Clips = clipsPaths;
                };
            }
        }
    }
}

绑定到ViewModel说明

如果需要在ViewModel中拿到录制的视频路径,直接在XAML中绑定Clips属性即可:

<renderers:CameraView 
    Camera="Rear"
    Clips="{Binding RecordedVideoClips}" />

ViewModel中对应的RecordedVideoClips属性会在每次录制完成后自动收到更新的路径数组。

内容的提问来源于stack exchange,提问作者Jaime Santos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:06:03