正在刷新所选项目ListView Xamarin Forms



我正在尝试刷新列表视图中的selectedItem。我单击列表中的一个项目,该项目将导航到另一个页面,其中包括所选项目中的项目。然后我更新详细信息并点击保存按钮。然后我导航回列表视图页面。

数据库中的数据已更改,但列表视图中选定的项目仍显示旧值。

如何刷新我更改的项目?

当我拖动以刷新时,它会显示新值,但当我单击另一个内容页面中的保存按钮时,我需要它来刷新。请帮帮我。

GuestInfo gi = new GuestInfo ();
MessagingCenter.Send (this, "hi", "1");
gi.guestDetailsUpdated ();

在上面的部分中,我添加了使用消息中心发送信息,该消息中心位于一次内容页面中。

MessagingCenter.Subscribe(this, "hi", sender => {
RetrieveReservationList();
});

上面的代码在另一个内容页面中,它应该触发发送来识别从另一个页面点击的按钮的台面,以便刷新该页面。

guestInfo是一个内容页。RetriveReserveList是获取数据的方法。guestDetails Upload是另一个内容页面中的方法,该方法由单击按钮的页面触发。

有几种方法可以做到这一点。

首先,您可以在每次屏幕上出现页面时刷新列表数据,即调用OnAppearing方法。假设您有一个属性为MyItemsMyViewModel,您将ListView的ItemSource绑定到该属性。此外,您应该有一个方法LoadMyItems,它将从数据库或web服务中获取项目,并将值分配给MyItems。在你的页面课上,你会做一些类似的事情

public class MyPage : ContentPage
{
private MyViewModel _viewModel;
public MyPage()
{
InitializeComponent();
_viewModel = new MyViewModel();
BindingContext = _viewModel;
}
protected override void OnAppearing()
{
base.OnAppearing();
_viewModel.LoadMyItems();
}
}

因此,每次显示屏幕时,数据都会更新。无论数据是否更改,这种方法都会导致您的列表视图刷新。有更好、更有效的方法可以做到这一点。

你可以在Xamarin中使用广播消息。形式是MessagingCenter。你可以在这里找到一篇好文章。基本上,您需要做的是在保存项目时发送一条消息,并在ViewModel中捕获该消息并更新MyItems

将项目保存到数据库时发送消息

MessagingCenter.Send(this, "MyItemsChanged");

在视图模型中,订阅该消息并更新重新加载项目。

MessagingCenter.Subscribe(this, "MyItemsChanged", sender => {
LoadMyItems();
});

您可以使用ObservableCollection对此进行一点改进,并且只更新已更改的项目。像这样的东西。

将更改后的元素的id作为消息的参数发送

MessagingCenter.Send(this, "MyItemsChanged", MY_ITEM_ID);

订阅该消息,在MyItems集合中找到更改后的元素,并通过从数据库中重新蚀刻该元素来替换它

MessagingCenter.Subscribe<object, string>(this, "MyItemsChanged", async (sender, id) => {
var index = MyItems.IndexOf(MyItems.FirstOrDefault(item => item.id == id));
MyItems[index] = await GetItemById(id);
});

我假设MyItems被定义为ObservableCollection<MyItem>,并且您有一个异步方法GetItemByItem(string itemId),它将从数据库中获取您的项目。

我发现了使用消息中心刷新视图模型中页面的清晰步骤。它对我来说效果很好。

步骤1:将项目保存到数据库时添加消息

MessagingCenter.Send(this, "MyItemsChanged");

步骤2:在您的视图中,在OnAppearing方法中添加以下代码

protected override void OnAppearing()
{   
base.OnAppearing();
_ViewModel.LoadServerRegisteredCitizens();
//LoadServerRegisteredCitizen is a method which i used to load items inside the listview        
}

步骤3:在视图模型构造函数中,订阅该消息并更新以重新加载您的项目

MessagingCenter.Subscribe<CurrentViewModelName>(this, "MyItemsChanged", sender => {
LoadServerRegisteredCitizens();
});

最新更新