我试图刷新列表视图中的selectedItem。我单击列表中的一个项目,该项目导航到另一个页面,包括所选项目中的项目。然后我更新详细信息并单击“保存”按钮。然后我导航回listview页面。
数据在数据库中更改,但列表视图中的选定项仍显示旧值。
如何刷新我更改的项目?
当我拉动刷新时显示新值,但是当我点击另一个内容页面中的保存按钮时,我需要刷新它。请帮帮我。
GuestInfo gi = new GuestInfo ();
MessagingCenter.Send (this, "hi", "1");
gi.guestDetailsUpdated ();
在上一节我添加了使用消息中心发送信息,这是一次内容页面。
MessagingCenter.Subscribe(this, "hi", sender => {
RetrieveReservationList();
});
上面的代码位于另一个内容页面中,该页面应该消除发送的消息以识别从另一页面给出的按钮点击以刷新此页面。
guestInfo是一个内容页面。 RetriveReservtionList是获取数据的方法。 guestDetailsUpload是另一个内容页面中从按钮点击页面触发的方法。
答案 0 :(得分:2)
有几种方法可以做到这一点。
首先,每当页面出现在屏幕上时,您都可以刷新列表数据,即调用OnAppearing
方法。假设您有一个MyViewModel
,其属性MyItems
与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.Forms中使用广播消息MessagingCenter
。你可以找到一篇好文章here。基本上,您需要做的是在保存项目时发送消息并在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 :(得分:0)
我找到了使用Messaging center在viewmodel中刷新页面的明确步骤。它对我来说很完美。
步骤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();
});