尝试将来自实时数据库的数据绑定到列表视图
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
会在您收到实时数据之前被调用。
我在 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
会在您收到实时数据之前被调用。