如何在 VM 出现 V 时调用刷新任务

How to call the refresh task on appearing of the V from VM

我有一些 NoteItem 对象,存储在数据库中。我已经在 EditingPage 中对它们进行了编辑,并且它们已经在数据库中,可以正常工作。但是当我返回到 MainPage 时,我想调用 Task Refresh() 来显示我添加到我的数据库中的新 NoteItem 对象。我该怎么做?

从 NoteItemsViewModel.cs 刷新任务(在 MainPage 中使用)

public AsyncCommand RefreshCommand { get; }
        public async Task Refresh()
        {
            await Task.Delay(2000);
            NoteItems.Clear();
            var NoteItemsBeingRefreshed = await Service.GetNotesFromDB();
            NoteItems.AddRange(NoteItemsBeingRefreshed);

            //for debugging
            foreach (var noteItem in NoteItems)
            {
                Console.WriteLine(noteItem.Id);
                Console.WriteLine(" " + noteItem.Text);
            }

        }

据我所知,并非所有人都理解我的问题。 首先我要说的是,NoteItems 是ObservableRangeCollection。 其次,问题不是显示更新,而是从我拥有的 SQL 数据库更新此集合中的项目。

MainPage.xaml

<ListView 
                x:Name="NoteItemsList" 
                ItemsSource="{Binding NoteItems}" 
                Margin="0"
                FlexLayout.AlignSelf="Start"
            >
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell >
                            <FlexLayout JustifyContent="SpaceBetween" AlignItems="Center" Margin="20,0">
                                <Label 
                                    Text="{Binding Text}"
                                />

以及我在 EditingPage VM 中更新数据库的操作 await Service.AddNoteToDB(Text);

在Xamarin中,可以使用ObservableCollection代替List进行暂存data.The xaml页面每次都会自动刷新ObservableCollection的值已修改。

根据您的逻辑需求,有两种解决方法。

  1. 每次修改数据库后修改ObservableCollection里面的值,这样xaml页面的值会自动刷新

  2. 每次跳转到MainPage(覆盖OnAppearing方法)时,从数据库中查询值并更改ObservableCollection的值。

您无需调用刷新方法即可将新值显示到 UI。您应该使用绑定到 XAML 中的数据模板的可观察范围集合,然后用于通过绑定更新到您希望它们绑定到的 UI 元素。请记住,您不想使用 foreach 循环来更新 属性。相反,使用一个列表,然后在 foreach 循环的末尾,将您的可观察范围集合 属性 = 设置为列表。这将防止 UI 重绘 foreach 循环的每次迭代,因为它只会更新绑定 属性 一次。