Listview 刷新所选项目列表视图Xamarin表单

Listview 刷新所选项目列表视图Xamarin表单,listview,xamarin,xamarin.forms,Listview,Xamarin,Xamarin.forms,我正在尝试刷新列表视图中的selectedItem。我单击列表中的一个项目,该项目将导航到另一个页面,其中包括所选项目中的项目。然后我更新详细信息并单击保存按钮。然后im导航回listview页面 数据库中的数据已更改,但列表视图中的选定项仍显示旧值 如何刷新已更改的项目 当我拉刷新时,它会显示新值,但当我单击另一个内容页中的“保存”按钮时,我需要它来刷新。请帮帮我 GuestInfo gi = new GuestInfo (); MessagingCenter.Send (this, "hi"

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

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

如何刷新已更改的项目

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

GuestInfo gi = new GuestInfo ();
MessagingCenter.Send (this, "hi", "1");
gi.guestDetailsUpdated ();
在上面的部分中,我添加了使用消息中心发送信息的功能,消息中心位于once内容页中

    MessagingCenter.Subscribe(this, "hi", sender => {
            RetrieveReservationList();
        });
上面的代码位于另一个内容页中,该内容页应触发被发送用于识别另一页中的按钮单击以刷新此页的mesage

guestInfo是一个内容页。 RetrivereServationList是获取数据的方法。
guestDetailsUpload是另一个内容页面中的方法,它是从单击按钮的页面触发的。

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

首先,每次页面出现在屏幕上时,您都可以刷新列表数据,即调用appearing方法。假设您有一个带有属性的
MyItems
MyViewModel
,您可以将ListView的ItemSource绑定到该属性。您还应该有一个方法
LoadMyItems
,它将从数据库或web服务中获取项目,并将值分配给
MyItems
。在page类中,您将执行以下操作

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
。你可以找到一篇好文章。基本上,您需要做的是在保存项目时发送一条消息,并在
ViewModel
中捕获该消息,然后更新
MyItems

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

MessagingCenter.Send(this, "MyItemsChanged");
MessagingCenter.Subscribe<object, string>(this, "MyItemsChanged", async (sender, id) => {
                var index = MyItems.IndexOf(MyItems.FirstOrDefault(item => item.id == id));
                MyItems[index] = await GetItemById(id);
            });
    MessagingCenter.Send(this, "MyItemsChanged");
在视图模型中,订阅该消息并更新并重新加载项目

MessagingCenter.Subscribe(this, "MyItemsChanged", sender => {
                LoadMyItems();
            });
您可以通过使用
ObservableCollection
稍微改进这一点,并仅更新已更改的项。像这样的

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

MessagingCenter.Send(this, "MyItemsChanged", MY_ITEM_ID);
订阅该消息,在
MyItems
集合中找到已更改的元素,并通过从数据库中重新提取该元素来替换它

MessagingCenter.Send(this, "MyItemsChanged");
MessagingCenter.Subscribe<object, string>(this, "MyItemsChanged", async (sender, id) => {
                var index = MyItems.IndexOf(MyItems.FirstOrDefault(item => item.id == id));
                MyItems[index] = await GetItemById(id);
            });
    MessagingCenter.Send(this, "MyItemsChanged");
MessagingCenter.Subscribe(此“MyItemsChanged”,异步(发送方,id)=>{
var index=MyItems.IndexOf(MyItems.FirstOrDefault(item=>item.id==id));
MyItems[index]=等待GetItemById(id);
});

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

我找到了使用消息中心刷新viewmodel中页面的清晰步骤。这对我来说会很好用的

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

MessagingCenter.Send(this, "MyItemsChanged");
MessagingCenter.Subscribe<object, string>(this, "MyItemsChanged", async (sender, id) => {
                var index = MyItems.IndexOf(MyItems.FirstOrDefault(item => item.id == id));
                MyItems[index] = await GetItemById(id);
            });
    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();
            });
MessagingCenter.Subscribe(此“MyItemsChanged”,发件人=>{
LoadServerRegisteredCitizens();
});

Hi可能重复,您能帮我做一个样品吗?这很难理解,因为保存按钮位于另一个内容页面中。在未刷新的
页面的
的appearing
方法上,可以调用调用PullToRefresh的任何方法。如果不发布您遇到问题的任何代码,则很难为您的问题提供解决方案;-)您好,出现时如何调用pull to refresh方法?它有两个我需要传递的参数。我应该在其中传递什么?还要注意,具有列表视图的页面是内容页面中的选项卡。单击某个项目时,我使用“wait Navigation.PushAsync”方法转到编辑所选列表视图项目的页面。保存后,我需要返回带有刷新列表视图的选项卡页面。我做得对吗?我正在使用“this.Navigation.RemovePage(this);”删除导航页面,返回选项卡页面。您好,对于second方法,我收到了此错误。方法“MessagingCenter.Subscribe”的类型参数(对象、字符串、操作、TSender)'无法从用法中推断。请尝试显式指定类型参数。请替换MessagingCenter.Subscribe为MessagingCenter.SubscribeHi,以获取答复,并对延迟表示抱歉。我已将其包含在方法中。但当我从其他内容页传递消息时,它仍不会触发。请替换您的发送/订阅代码使用此MessagingCenter.Send(此“hi”,“1”);MessagingCenter.Subscribe(此“hi”,“发件人,参数)=>{});