首页 > 解决方案 > UI 未使用 xamarin 中的分组 observablecollection 更新

问题描述

我对 xamarin-forms 比较陌生,并且已经遇到这个问题好几天了。我已经阅读了很多信息,但我无法解决它。我有一个可观察的集合,它在 UpdateListContent () 的帮助下分组在列表视图中,我从另一个网站获取了这部分,它工作正常。问题是当我修改内容并返回到组所在的屏幕时,UI 没有更新,数据到达并被正确处理,但不可见。我读到您必须对 OC 实施 OnPropertyChanged 以便更新视图,我已经尝试过这种方式以及其他一千种方式,但我不能。当我将 OnPropertyChanged 提供给 OC 或尝试强制视图为空并再次分配数据时,我总是在以下位置收到相同的错误:

GroupedView.ItemsSource = "";

“你调用的对象是空的。”

使用 UpdateListContent () 这是我发现做我需要的唯一方法,但我需要更新 UI。我可能做错了什么,但我的想法已经结束,我找不到其他任何东西。

我真的很感激帮助。谢谢你。

VS2019 16.2.4

XF 4.1.0

代码背后



public partial class CandidatosView : ContentPage, INotifyPropertyChanged
{
    private ObservableCollection<CandidatoGroup> allGroups { get; set; }

    //private ObservableCollection<CandidatoGroup> _expandedGroups;

    //public ObservableCollection<CandidatoGroup> expandedGroups
    //{
    //    get { return _expandedGroups; }
    //    set
    //    {
    //        _expandedGroups = value;
    //        OnPropertyChanged("expandedGroups");
    //    }
    //}
    private ObservableCollection<CandidatoGroup> expandedGroups { get; set; }

    public CandidatosView()
    { }

    public CandidatosView(Guid IdOferta)
    {
        InitializeComponent();
        BindingContext = new CandidatosViewModel(IdOferta);
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        allGroups = CandidatosViewModel.All;
        allGroups.ForEach(x => x.Expanded = false);
        UpdateListContent();
    }
    private void HeaderTapped(object sender, EventArgs args)
    {
        int selectedIndex = expandedGroups.IndexOf(
            ((CandidatoGroup)((Button)sender).CommandParameter));
        allGroups[selectedIndex].Expanded = !allGroups[selectedIndex].Expanded;
        UpdateListContent();
    }

    private void UpdateListContent()
    {
        MessagingCenter.Subscribe<GestionCandidatoViewModel>(this, "Expanded", sender =>
        {
            allGroups.ForEach(x => x.Expanded = false);
        });
        expandedGroups = new ObservableCollection<CandidatoGroup>();
        foreach (CandidatoGroup group in allGroups)
        {
            CandidatoGroup newGroup = new CandidatoGroup(group.Title, group.ShortName, group.Expanded);
            newGroup.CandidatosCount = group.Count;
            if (group.Expanded)
            {
                foreach (Candidato candidato in group)
                {
                    newGroup.Add(candidato);
                }
            }
            expandedGroups.Add(newGroup);
        }
        try
        {
            GroupedView.ItemsSource = "";
            GroupedView.ItemsSource = expandedGroups;
        }
        catch (Exception ex)
        {
            Application.Current.MainPage.DisplayAlert("Error", ex.Message, "Ok");
        }
    }
}

CandidatoGroup 类

public class CandidatoGroup : ObservableCollection<Candidato>, INotifyPropertyChanged
    {
        private bool _expanded;

        public string Title { get; set; }

        public string TitleWithItemCount
        {
            get { return string.Format("{0} ({1})", Title, CandidatosCount); }
        }

        public string ShortName { get; set; }

        public bool Expanded
        {
            get { return _expanded; }
            set
            {
                if (_expanded != value)
                {
                    _expanded = value;
                    OnPropertyChanged("Expanded");
                    OnPropertyChanged("StateIcon");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public string StateIcon
        {
            get { return Expanded ? "down" : "up"; }
        }

        public int CandidatosCount { get; set; }

        public CandidatoGroup(string title, string shortName, bool expanded = true)
        {
            Title = title;
            ShortName = shortName;
            Expanded = expanded;
        }
    }


标签: c#androidxamarinxamarin.formsxamarin.android

解决方案


错误就在这里

public CandidatosView(Guid IdOferta)
{
    InitializeComponent();
    BindingContext = new CandidatosViewModel(IdOferta);
}

它应该this代替new CandidatosViewModel(IdOferta);

更正:

public CandidatosView(Guid IdOferta)
{
    InitializeComponent();
    BindingContext = this;
}

推荐阅读