我正在尝试刷新列表视图中的selectedItem。我单击列表中的一个项目,该项目将导航到另一个页面,其中包括所选项目中的项目。然后我更新详细信息并点击保存按钮。然后我导航回列表视图页面。
数据库中的数据已更改,但列表视图中选定的项目仍显示旧值。
如何刷新我更改的项目?
当我拖动以刷新时,它会显示新值,但当我单击另一个内容页面中的保存按钮时,我需要它来刷新。请帮帮我。
GuestInfo gi = new GuestInfo ();
MessagingCenter.Send (this, "hi", "1");
gi.guestDetailsUpdated ();
在上面的部分中,我添加了使用消息中心发送信息,该消息中心位于一次内容页面中。
MessagingCenter.Subscribe(this, "hi", sender => {
RetrieveReservationList();
});
上面的代码在另一个内容页面中,它应该触发发送来识别从另一个页面点击的按钮的台面,以便刷新该页面。
guestInfo是一个内容页。RetriveReserveList是获取数据的方法。guestDetails Upload是另一个内容页面中的方法,该方法由单击按钮的页面触发。
有几种方法可以做到这一点。
首先,您可以在每次屏幕上出现页面时刷新列表数据,即调用OnAppearing
方法。假设您有一个属性为MyItems
的MyViewModel
,您将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();
});