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

Xamarin Forms中ObservableCollection更新后UI未刷新问题求助

Xamarin Forms CollectionView UI不刷新问题的原因及解决办法

问题原因

  • APIPatrolD类未实现属性变更通知:ObservableCollection<T>仅会在集合元素增删、整体替换时触发UI刷新,无法监听集合内单个对象的属性变化。你修改aPIPatrolD.patrold_remark时,UI无法感知到属性值的变更。
  • 手动触发集合的PropertyChanged无效:OnPropertyChanged("DAPIPatrolDSiapImbasList")仅在集合引用改变时生效,而你只是修改了集合内部元素的属性,集合本身的引用未变,所以这个通知不会触发UI更新。

解决步骤

1. 让APIPatrolD实现INotifyPropertyChanged

修改APIPatrolD类,继承已实现INotifyPropertyChanged的BaseViewModel,将所有字段改为带属性变更通知的属性:

public class APIPatrolD : BaseViewModel
{
    private string _patrold_ID;
    public string patrold_ID
    {
        get { return _patrold_ID; }
        set
        {
            _patrold_ID = value;
            OnPropertyChanged();
        }
    }

    private string _patrold_loc;
    public string patrold_loc
    {
        get { return _patrold_loc; }
        set
        {
            _patrold_loc = value;
            OnPropertyChanged();
        }
    }

    private int _patrold_seq;
    public int patrold_seq
    {
        get { return _patrold_seq; }
        set
        {
            _patrold_seq = value;
            OnPropertyChanged();
        }
    }

    private string _patrold_desc;
    public string patrold_desc
    {
        get { return _patrold_desc; }
        set
        {
            _patrold_desc = value;
            OnPropertyChanged();
        }
    }

    private byte[] _patrold_image;
    public byte[] patrold_image
    {
        get { return _patrold_image; }
        set
        {
            _patrold_image = value;
            OnPropertyChanged();
        }
    }

    private string _patrold_GPS;
    public string patrold_GPS
    {
        get { return _patrold_GPS; }
        set
        {
            _patrold_GPS = value;
            OnPropertyChanged();
        }
    }

    private string _patrold_takenGPS;
    public string patrold_takenGPS
    {
        get { return _patrold_takenGPS; }
        set
        {
            _patrold_takenGPS = value;
            OnPropertyChanged();
        }
    }

    private DateTime _patrold_takenDateTime;
    public DateTime patrold_takenDateTime
    {
        get { return _patrold_takenDateTime; }
        set
        {
            _patrold_takenDateTime = value;
            OnPropertyChanged();
        }
    }

    private string _patrold_remark;
    public string patrold_remark
    {
        get { return _patrold_remark; }
        set
        {
            _patrold_remark = value;
            OnPropertyChanged();
        }
    }
}

2. 优化按钮点击逻辑

不需要再遍历集合查找元素,直接修改传入的obj即可(obj就是集合中的实例,属性变更会自动通知UI):

private async void OnRemarksButtonClickedAsync(APIPatrolD obj)
{
    var result = await App.Current.MainPage.Navigation.ShowPopupAsync(new CustomizePopups(obj));
    obj.patrold_remark = (string)result;
    // 无需调用OnPropertyChanged("DAPIPatrolDSiapImbasList")
}

3. 确认UI绑定

保持XAML中的绑定配置不变,patrold_remark现在会在值变化时自动触发UI更新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:35:29