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

Xamarin.Forms自定义ContentView的Item、viewProgress绑定属性不更新问题

问题根源

你遇到的问题是对Xamarin.Forms中可绑定属性的常规调用逻辑理解偏差导致的,核心有两个错误点:

  1. 可绑定属性的CLR包装器setter不会被运行时调用:Xamarin.Forms在更新BindableProperty的值时,会直接调用SetValue方法,不会走你自定义的Item属性的setter,所以你写在setter里的OnPropertyChanged代码从来没有执行过,自然无法通知viewProgress更新。
  2. viewProgress属性定义错误:你为计算属性viewProgress额外声明了BindableProperty,但实际getter完全走自定义逻辑,两者没有关联,属于多余且错误的声明。
修复方案

直接修改OrderItem的后台代码即可,步骤如下:

1. 为Item可绑定属性添加变更回调

通过BindableProperty.Create的propertyChanged参数指定属性变更后的回调方法,这是可绑定属性值变更后唯一可靠的触发入口。

2. 删除viewProgress的可绑定属性声明

viewProgress是完全依赖Item状态的计算属性,不需要声明为可绑定属性,只保留普通CLR属性的getter即可。

3. 可选:支持Order内部属性变更响应

如果后续需要支持Order实例的Status属性动态变更时自动更新viewProgress,还需要订阅Order的PropertyChanged事件。

修改后完整代码
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.ComponentModel;

namespace HandTerminal
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class OrderItem : ContentView
    {
        public OrderItem()
        {
            InitializeComponent();
            Content.BindingContext = this;
        }

        public static BindableProperty ItemProperty = BindableProperty.Create(
            propertyName: "Item",
            returnType: typeof(Order),
            declaringType: typeof(OrderItem),
            defaultValue: null,
            defaultBindingMode: BindingMode.OneWay,
            propertyChanged: OnItemChanged); // 新增属性变更回调

        public Order Item
        {
            get => (Order)GetValue(ItemProperty);
            set => SetValue(ItemProperty, value);
        }

        // 移除了viewProgress的BindableProperty声明
        public bool viewProgress
        {
            get
            {
                // 加空判断避免空引用异常
                return Item != null && Item.Status == OrderStatus.Picking;
            }
        }

        private static void OnItemChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var control = (OrderItem)bindable;
            // 取消旧Order实例的事件订阅
            if (oldValue is Order oldOrder)
            {
                oldOrder.PropertyChanged -= control.OnOrderPropertyChanged;
            }
            // 订阅新Order实例的事件
            if (newValue is Order newOrder)
            {
                newOrder.PropertyChanged += control.OnOrderPropertyChanged;
            }
            // 通知属性变更
            control.OnPropertyChanged(nameof(Item));
            control.OnPropertyChanged(nameof(viewProgress));
        }

        private void OnOrderPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            // 只有Status变更时才通知viewProgress更新
            if (e.PropertyName == nameof(Order.Status))
            {
                OnPropertyChanged(nameof(viewProgress));
            }
        }
    }
}
额外注意项

请确认你的Order类已经正确实现了INotifyPropertyChanged接口,否则内部属性变更时无法触发通知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:03