我迷路了。我无法弄清楚为什么我的可观察集合没有实时更新。我必须关闭应用程序并重新打开它才能看到更新。所以希望有人能指出我正确的方向。
Nuget 包 - FirebaseDatabase.net MvvmHelpers Xamarin 社区工具包 Xamarin forms Xamarin Essentials
所以基本上我有一个 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 页面 - 我有一个 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 的列表中添加一个新朋友的地方 - 没什么有趣的 - 只是一个添加新朋友的按钮。页面视图模型——
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 应该在成员数量发生变化时立即触发属性变化。所以我被困住了。不知道我错过了什么。我保留了不相关的代码(至少我认为不相关的代码),如果您需要查看更多信息,请告诉我......我会更新帖子。我的编码水平不是初学者..它更像是中等水平,所以如果你对我来说都是专家,它会超过我的头脑:-)