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

Xamarin Forms迁移至MAUI后BindableProperty报错求助

解决Xamarin Forms迁移MAUI时BindableProperty泛型方法报错问题

问题原因

MAUI移除了Xamarin Forms中BindableProperty.Create<TSource, TProperty>的泛型重载,原代码使用的泛型写法在MAUI中不再被支持,因此触发编译错误。

修改方案

将所有泛型形式的BindableProperty.Create调用替换为非泛型版本,手动指定属性名称、属性类型、宿主控件类型、默认值及回调委托,同时调整回调方法的参数类型适配MAUI要求。

修改后的完整代码如下:

namespace PRojall
{
    public partial class CustomImage : Grid
    {
        public static readonly BindableProperty StatusProperty = BindableProperty.Create(
            nameof(Status),
            typeof(ImageStatus),
            typeof(CustomImage),
            ImageStatus.Loading,
            propertyChanged: OnStatusChanged);

        public static readonly BindableProperty SourceProperty = BindableProperty.Create(
            nameof(Source),
            typeof(ImageSource),
            typeof(CustomImage),
            null,
            propertyChanged: OnSourceChanged);

        public static readonly BindableProperty AspectProperty = BindableProperty.Create(
            nameof(Aspect),
            typeof(Aspect),
            typeof(CustomImage),
            Aspect.AspectFit,
            propertyChanged: OnAspectChanged);


        public CustomImage()
        {
            InitializeComponent();
            SetImage(ImageStatus.Loading);
        }

        public ImageStatus Status
        {
            get { return (ImageStatus)GetValue(StatusProperty); }
            set { SetValue(StatusProperty, value); SetImage(value); }
        }

        public ImageSource Source
        {
            get { return (ImageSource)GetValue(SourceProperty); }
            set { SetValue(SourceProperty, value); }
        }
        public Aspect Aspect 
        { 
            get { return (Aspect)GetValue(AspectProperty); }
            set { SetValue(AspectProperty, value); }
        }


        private static void OnStatusChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var obj = bindable as CustomImage;
            if (obj != null && oldValue is ImageStatus oldStatus && newValue is ImageStatus newStatus && oldStatus != newStatus)
            {
                obj.SetImage(newStatus);
            }
        }

        private static void OnAspectChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var obj = bindable as CustomImage;
            if (obj != null && oldValue is Aspect oldAspect && newValue is Aspect newAspect && oldAspect != newAspect)
            {
                obj.image.Aspect = newAspect;
            }
        }


        private static void OnSourceChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var obj = bindable as CustomImage;
            if (obj != null && oldValue != newValue && newValue is ImageSource newSource)
            {
                obj.image.Source = newSource;
            }
        }
        
        private void SetImage(ImageStatus status)
        {
            switch (status)
            {
                case ImageStatus.Loading:
                    this.Source = ImageSource.FromFile("loading.png");
                    break;
                case ImageStatus.Error:
                    this.Source = ImageSource.FromFile("error.png");
                    break;
                case ImageStatus.NoImage:
                    this.Source = ImageSource.FromFile("noimage.png");
                    break;
            }
        }
    }
}

关键修改说明

  1. BindableProperty定义:用非泛型BindableProperty.Create替代泛型版本,通过参数明确指定属性元数据,使用nameof()避免硬编码属性名。
  2. 回调方法参数:将回调方法的oldValue和newValue参数类型从具体类型改为object,内部增加类型校验和转换,确保类型安全。

内容的提问来源于stack exchange,提问作者Arvind Chourasiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:32