如何在 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的值已修改。
根据您的逻辑需求,有两种解决方法。
每次修改数据库后修改ObservableCollection里面的值,这样xaml页面的值会自动刷新
每次跳转到MainPage(覆盖OnAppearing方法)时,从数据库中查询值并更改ObservableCollection的值。
您无需调用刷新方法即可将新值显示到 UI。您应该使用绑定到 XAML 中的数据模板的可观察范围集合,然后用于通过绑定更新到您希望它们绑定到的 UI 元素。请记住,您不想使用 foreach 循环来更新 属性。相反,使用一个列表,然后在 foreach 循环的末尾,将您的可观察范围集合 属性 = 设置为列表。这将防止 UI 重绘 foreach 循环的每次迭代,因为它只会更新绑定 属性 一次。
我有一些 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的值已修改。
根据您的逻辑需求,有两种解决方法。
每次修改数据库后修改ObservableCollection里面的值,这样xaml页面的值会自动刷新
每次跳转到MainPage(覆盖OnAppearing方法)时,从数据库中查询值并更改ObservableCollection的值。
您无需调用刷新方法即可将新值显示到 UI。您应该使用绑定到 XAML 中的数据模板的可观察范围集合,然后用于通过绑定更新到您希望它们绑定到的 UI 元素。请记住,您不想使用 foreach 循环来更新 属性。相反,使用一个列表,然后在 foreach 循环的末尾,将您的可观察范围集合 属性 = 设置为列表。这将防止 UI 重绘 foreach 循环的每次迭代,因为它只会更新绑定 属性 一次。