尝试将来自实时数据库的数据绑定到列表视图

Trying to Bind data from realtime database for a list view

我在 firebase 实时数据库上有一个这样的数据库:

->宠物资料

->Node
     ->UserEmail
     ->PetName
     ->Breed
->Node
     ->UserEmail
     ->PetName
     ->Breed
 ->Node
     ->UserEmail
     ->PetName
     ->Breed

我想绑定此数据以创建列表视图,但是我只想使用具有相同 UserEmail 的分支(只是在列表视图中向他们显示已登录用户的宠物)。但是屏幕上没有显示任何数据。我想我错误地填充了我的 ObservableCollection。能否请您指点一下。

视图模型:

class MyIDPageViewModel : INotifyPropertyChanged
{
    FirebaseHelper firebaseHelper = new FirebaseHelper();

    readonly IList<PetProfile> source;

    public ObservableCollection<PetProfile> PetInfo { get; private set; }
    public IList<PetProfile> EmptyPetInfo { get; private set; }

    public MyIDPageViewModel()
    {
        source = new List<PetProfile>();
        CreatePetProfileCollection();
        OnPropertyChanged();
    }


    private async void CreatePetProfileCollection()
    {
        var petProfiles = await firebaseHelper.GetAllUserPetInfos();
        if(petProfiles != null)
        {
            foreach (var groupitems in petProfiles)
            {
                source.Add(new PetProfile() { PetName = groupitems.PetName });
            }

        }
        
        PetInfo = new ObservableCollection<PetProfile>(source);
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

}

''' Firebase 助手:

public async Task<List<PetProfile>> GetAllUserPetInfos()
    {
        var useremail = Preferences.Get("UserSignInEmail", "");

        var PetProfiles = await GetAllPetInfos();
        await firebase
          .Child("PetProfiles")
          .OnceAsync<PetProfile>();
        return PetProfiles.Where(a => a.UserEmail == useremail).ToList();
       
    }

有两种方法可以解决此问题,但有一种方法无法正常工作;) 那么为什么它不起作用? 即使您正在实现 INotifyPropertyChanged 接口,您也从未真正调用该事件。添加到 PropertyChanged 事件的 PropertyChangedEventHandler 委托必须手动调用。 做的时候 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 您正在这样做,但是您没有在代码中的任何地方调用 OnPropertyChanged

那么你如何解决这个问题。
1.

    public IList<PetProfile> EmptyPetInfo { 
        get => source;
        private set {
            if (value != source) {
                source = value;
                OnPropertyChanged(nameof(EmptyPetInfo));
            }
        }
    }

在 ObservableCollection 的 setter 中调用 OnPropertyChanged

2.

    private async void CreatePetProfileCollection()
    {
        var petProfiles = await firebaseHelper.GetAllUserPetInfos();
        if(petProfiles != null)
        {
            PetInfo = new ObservableCollection<PetProfile>();
            foreach (var groupitems in petProfiles)
            {
                PetInfo.Add(new PetProfile() { PetName = groupitems.PetName });
            }
        }
    }

改为将对象添加到 ObservableCollection。

编辑:没有看到您在调用 OnPropertyChanged 时没有来自构造函数的参数。您必须提供希望在视图中更新其值的 属性 的名称。 在调用 OnPropertyChanged 之前以为您也在执行异步方法。当您调用异步方法时,它会在一个新线程上启动,并在您的构造函数中继续执行。因此 OnPropertyChanged 会在您收到实时数据之前被调用。