Mopup弹窗关闭后如何调用原页面OnAppearing更新CollectionView
解决Mopup弹窗删除数据后更新CollectionView的简单方法
不需要手动调用OnAppearing,直接刷新数据源或更新集合更直接,这里给你两个简单的实现方式:
方法1:弹窗关闭后直接调用原页面的刷新方法
在弹窗的删除按钮事件里,关闭弹窗后获取导航栈中的原页面,调用自定义刷新方法:
弹窗中的修改代码:
private async void DeleteItem_Clicked(object sender, EventArgs e) { var result = await DisplayAlert("Delete", $"Delete {Item.Name} from the database", "Yes", "No"); if (result) { await App.Database.DeleteItem(Item); await MopupService.Instance.PopAsync(); // 替换成你的原页面类型,比如MainPage/ItemsPage var sourcePage = MopupService.Instance.PopupStack.LastOrDefault() as YourSourcePage; sourcePage?.RefreshCollectionView(); } }
原页面添加刷新方法:
在包含CollectionView的页面里,新增一个刷新数据源的方法:
public async void RefreshCollectionView() { // 重新从数据库获取最新数据并赋值给CollectionView // 如果你用的是普通List: YourCollectionView.ItemsSource = await App.Database.GetAllItemsAsync(); // 如果你用的是ObservableCollection,也可以直接移除删除的项(更高效): // var existingItem = YourObservableCollection.FirstOrDefault(x => x.Id == Item.Id); // if (existingItem != null) YourObservableCollection.Remove(existingItem); }
方法2:通过事件回调通知原页面刷新
这种方式更解耦,不需要硬编码原页面类型:
弹窗类中添加事件:
// 在弹窗类的顶部定义事件 public event EventHandler ItemDeleted; private async void DeleteItem_Clicked(object sender, EventArgs e) { var result = await DisplayAlert("Delete", $"Delete {Item.Name} from the database", "Yes", "No"); if (result) { await App.Database.DeleteItem(Item); await MopupService.Instance.PopAsync(); // 触发删除完成事件 ItemDeleted?.Invoke(this, EventArgs.Empty); } }
原页面打开弹窗时订阅事件:
在你打开Mopup弹窗的地方,添加事件订阅:
// 实例化弹窗并传入Item var itemPopup = new YourItemPopup(Item); // 订阅删除完成事件 itemPopup.ItemDeleted += (sender, e) => { RefreshCollectionView(); // 调用之前写的刷新方法 }; // 打开弹窗 await MopupService.Instance.PushAsync(itemPopup);
两种方法都不需要依赖MVVM,都是简单的代码实现,选哪种看你自己的需求。如果原页面类型固定,方法1更直接;如果需要复用弹窗,方法2更灵活。
内容的提问来源于stack exchange,提问作者Mufacka
相关产品推荐
相关产品推荐

