从另一个 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.csMerchandiserNewPage.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?

当从另一个 ObservedObject 链接到 Published 属性时,视图不会对更改做出反应

如何从另一个类调用viewmodel方法

如何从另一个网格的另一个选定记录将数据添加到网格

我如何使用视图模型从另一个片段访问函数

Xamarin MVVM 从另一个页面删除 Listview 项目