从另一个 ViewModel 添加/删除记录时,ListView 不会更新?
Posted
技术标签:
【中文标题】从另一个 ViewModel 添加/删除记录时,ListView 不会更新?【英文标题】:ListView will not update when adding/removing records from another ViewModel? 【发布时间】:2021-07-15 06:49:05 【问题描述】:ListView 没有更新
我在我的MerchandisersPage.xaml
中有一个ListView
,当我在 SQLite 数据库中添加或删除记录时它没有更新。
MerchandiserPage.xaml
中的ListView
显示Merchandisers
列表并绑定到MerchandiserPageViewModel.cs
中的ObservableCollection
将Merchandiser
添加到数据库使用绑定到MerchansiderNewPageViewModel.cs
的MerchandiserNewPage.xaml
将Merchandiser
删除到数据库使用MerchandiserProfilePage.xaml
页面并绑定到MerchandiserProfilePageViewModel.cs
在MerchandiserNewPageViewModel
(insert) 和MerchandiserProfilePage
(delete) 中所做的更改不会反映在 ListView 中。
跟单员(模特)
public class Merchandiser : INotifyPropertyChanged
public int Id
get return this.id;
set
this.id = value;
OnPropertyChanged();
/// Etc....
MerchandisersPage.xaml(查看)
<!--Merchandiser List-->
<ListView ItemsSource="Binding Merchandisers"
MerchandisersPage.xaml.cs(代码隐藏)
public Models.Merchandiser SelectedMerchandiser get; set;
public MerchandisersPage ()
this.BindingContext = new ViewModels.Supervisor.MerchandisersPageViewModel();
MerchandisersPageViewModel(视图模型)
public ObservableCollection<Models.Merchandiser> Merchandisers get; set;
public MerchandisersPageViewModel()
Merchandisers = new ObservableCollection<Models.Merchandiser>(Database.MerchandiserDatabase.GetMerchandisers());
MerchandiserProfilePage.xaml(查看)
<Label Text="Name"/>
<Entry Text="Binding SelectedMerchandiser.Name"
MerchandiserProfilePage.xaml.cs(代码隐藏)
this.BindingContext = new ViewModels.MerchandiserProfilePageViewModel(selectedMerchandiser);
MerchandiserProfilePageViewModel.cs (ViewModel)
public Models.Merchandiser SelectedMerchandiser get; set;
public MerchandiserProfilePageViewModel(Models.Merchandiser selectedMerchandiser)
SelectedMerchandiser = selectedMerchandiser;
MerchandiserEditPage.xaml(查看)
<Label Text="Name"/>
<Entry Text="Binding SelectedMerchandiser.Name"/>
MerchandiserEditPage.xaml.cs(代码隐藏)
this.BindingContext = new ViewModels.MerchandiserEditPageViewModel(selectedMerchandiser);
MErchandiserEditPageViewModel.cs(视图模型)
public Models.Merchandiser SelectedMerchandiser get; set;
public MerchandiserEditPageViewModel(Models.Merchandiser selectedMerchandiser)
SaveCommand = new Command( async()=>
Database.MerchandiserDatabase.SaveMerchandiser(SelectedMerchandiser);
await Application.Current.MainPage.Navigation.PopModalAsync();
);
MerchandiserNewPage.xaml(查看)
<Label Text="Name"/>
<Entry Text="Binding Name"/>
MerchandiserNewPage.xaml.cs(代码隐藏)
this.BindingContext = new ViewModels.MerchandiserNewPageViewModel();
【问题讨论】:
这篇文章很好地说明了一个人在发布问题时绝对应该不做的所有事情。让社区用户观看问题的视频?查看。要求用户调试整个实际程序?查看。将所有这些代码放在外部站点上,而不是让问题自成一体?查看。未能提供正确的minimal reproducible example?查看。将修订历史记录作为文本的一部分,而不是让 Stack Overflow 网站跟踪历史记录?查看。请阅读minimal reproducible example 和How to Ask,并解决问题。 您能否以更简洁的方式提供您如何将视图实际绑定到您的 ObservableCollection?这样比让我们看视频和搜索 repo 文件更好......Listview
未更新以反映删除/新记录。我正在从不同的ViewModels
删除记录并将其直接添加到 SQLite 数据库中。我希望我的ListView
反映这些变化。
感谢彼得和加布里埃尔,我将更新我的帖子以更简洁。我个人认为有一个问题的视频会更容易实际看到问题是什么?我同意用户不应该调试整个应用程序,所以我将添加一些代码并更新我的问题。
@minlopalis 从您的描述和代码中,我看不到您在删除或添加数据后在 MerchandisersPage OnAppearing() 方法中再次加载数据库数据的位置,我发现有关显示 sqlite 数据的相同示例ListView,你可以看看:XamarinSQLite
【参考方案1】:
我必须将绑定上下文设置为 OnAppearing()
方法,当被覆盖时,允许在页面变得可见之前立即进行行为。
protected override void OnAppearing()
base.OnAppearing();
this.BindingContext = new ViewModels.Supervisor.MerchandisersPageViewModel();
【讨论】:
以上是关于从另一个 ViewModel 添加/删除记录时,ListView 不会更新?的主要内容,如果未能解决你的问题,请参考以下文章
Mvvm:如何更新我的ObservableCollection 从另一个ViewModel?