observable集合没有更新



我不知所措。我还没能弄清楚为什么我的可观察集合没有实时更新。我必须关闭应用程序并重新打开它以查看更新…所以希望有人能给我指个方向。

Nuget packages -FirebaseDatabase.netMvvmHelpersXamarin社区工具包Xamarin的形式Xamarin的必需品

所以基本上我有一个ObservableRangeCollection(从MVVMHelpers),从firebase实时数据库的朋友列表。

Friends类是一个非常简单的模型类-

public class Friend : ObservableObject
{
public Friend()
{
DateAdded = DateTime.Today;
}
string uid;
public string UID
{
get { return uid; }
set
{
SetProperty(ref uid, value);
}
}
DateTime dateAdded;
public DateTime DateAdded
{
get { return dateAdded; }
set
{
SetProperty(ref dateAdded, value);
}
}
string emailAddress;
public string EmailAddress
{
get { return emailAddress; }
set
{
SetProperty(ref emailAddress, value);
}
}

Xaml Page -我有一个绑定到Friends的CollectionView

<CollectionView HorizontalScrollBarVisibility="Default" ItemsSource="{Binding Friends}">
<CollectionView.ItemsLayout>
<LinearItemsLayout ItemSpacing="10" Orientation="Horizontal" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame Margin="0"
Padding="0"
BackgroundColor="Transparent"
BorderColor="Transparent"
HasShadow="False">
<StackLayout Orientation="Vertical">
<Frame Margin="0"
Padding="5"
BorderColor="DarkGray"
CornerRadius="25"
HeightRequest="35"
HorizontalOptions="Center"
WidthRequest="35">
<Image BackgroundColor="Transparent"
HorizontalOptions="Center"
Source="{StaticResource UserIcon}" />
</Frame>
<Frame Margin="0"
Padding="0"
BackgroundColor="Transparent">
<Label HorizontalTextAlignment="Center"
Style="{Binding TextSmallCaption}"
Text="{Binding EmailAddress}"
TextColor="Black"
VerticalTextAlignment="Center" />
</Frame>
</StackLayout>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>

PageViewModel -派生自BaseViewModel -它正确获取并显示好友列表

private ObservableRangeCollection<Friend> _friends = new ObservableRangeCollection<Friend>();
public ObservableRangeCollection<Friend> Friends
{
get { return _friends; }
set
{
_friends = value;
OnPropertyChanged();
}
}
public MessagingPageViewModel()
{
Title = "Messages";
services = new DBUserService();
CameraBtn = new MvvmHelpers.Commands.Command(Camera);
AddBtn = new MvvmHelpers.Commands.Command(Add);
AddContactBtn = new MvvmHelpers.Commands.Command(AddContact);
FriendsList();
}
public async void FriendsList()
{
// Retrieve my UID from preferences
string myUID = Preferences.Get("UID", string.Empty);
if (IsBusy)
return;
try
{
// Retrieve Friends List 
RetrieveFriendsList(myUID);
}
catch (System.Exception ex)
{ 
await Application.Current.MainPage.DisplayAlert("Error", ex.ToString(), "OK");
}
finally
{
IsBusy = false;
}
}
private async void RetrieveFriendsList(string myUID)
{
var response = await services.RetrieveFriendsList(myUID);
Friends.ReplaceRange(response);
}

模式页面-这是我添加一个新的朋友到实时数据库的列表Xaml -没什么有趣的-只是一个添加新朋友的按钮。PageViewModel——

private MvvmHelpers.ObservableRangeCollection<Friend> _friends = new MvvmHelpers.ObservableRangeCollection<Friend>();
public MvvmHelpers.ObservableRangeCollection<Friend> Friends
{
get { return _friends; }
set
{
_friends = value;
OnPropertyChanged();
}
}

public AddFriendPageViewModel()
{
services = new DBUserService();
AddFriendBtn = new MvvmHelpers.Commands.Command(AddFriend);

}

private void AddFriend(object obj)
{
Debug.WriteLine("Selected users to add " + obj);

AddFriendToList(obj.ToString());
}

private async void AddFriendToList(string uid)
{
// Retrieve my UID from preferences
string myUID = Preferences.Get("UID", string.Empty);

// Retrieve friend INFO
var dbUserService = new DBUserService();
var response = await dbUserService.RetrieveUser(uid);

bool result = await dbUserService.RegisterFriendList(myUID, uid, response.EmailAddress);
}

所以一旦我添加一个新用户到实时数据库,我关闭页面popModalAsync,它不显示更新的列表。如果我关闭应用程序并重新打开它,那么它会显示更新的列表。所以我错过了通知属性变化的地方。从我学到的MVVMHelpers做了大部分自己和CollectionView应该触发属性改变一旦成员的#改变。所以我被困住了。不知道我错过了什么。我保留了不相关的代码(至少我认为是不相关的),如果你需要看到更多,请告诉我…我会更新帖子的。我的编码水平不是初学者。它更像是中等的,所以如果你对我都是专家,它会超过我的头:-)

所以对于任何有同样问题的人。我通过尝试发现了一个错误,所以不确定哪个更改修复了它,但它在这里。

我把ObservableRangeCollection改成了普通的ObservableCollection

private ObservableCollection<Friend> _friends = new ObservableCollection<Friend>();
public ObservableCollection<Friend> Friends
{
get { return _friends; }
set
{
_friends = value;
OnPropertyChanged();
}
}
在检索方法上,我将其更改为
private void RetrieveFriendsList(string myUID)
{
//var response = await services.RetrieveFriendsList(myUID);
//Friends.ReplaceRange(response);
Friends = services.RetrieveFriendsList(myUID);
}

将方法从task更改为observablecollection

//public async Task<List<Friend>> RetrieveFriendsList (string myUID)
//{
//    return (await client
//        .Child("Users")
//        .Child(myUID)
//        .Child("FriendList")
//        .OnceAsync<Friend>())
//        .Select(u => new Friend
//        {
//            DateAdded = u.Object.DateAdded,
//            EmailAddress = u.Object.EmailAddress,
//            UID = u.Object.UID
//        }).ToList();
//}
public ObservableCollection<Friend> RetrieveFriendsList(string myUID)
{
var friendsList = client
.Child("Users")
.Child(myUID)
.Child("FriendList")
.AsObservable<Friend>()
.AsObservableCollection();
return friendsList;
}

最新更新