Xamarin.Forms 跨页调用后台方法刷新CollectionView方案
跨视图调用刷新方法实现方案
直接用回调委托实现即可,改动量最小,不需要引入额外的框架组件,完全适配你当前的代码结构。
第一步:修改MyAddWordPage后台代码
先修正你代码里的笔误:原代码中MyAddWordPage的构造函数错写为MyWordPage(),会直接触发编译错误,需要和类名保持一致。同时新增一个回调属性,在单词插入完成后触发外部传入的刷新逻辑:
public partial class MyAddWordPage : ContentPage { // 定义回调:插入单词完成后要执行的动作 public Action OnWordInserted { get; set; } public MyAddWordPage() { InitializeComponent(); } void OnInsertWord(System.Object sender, System.EventArgs e) { // 原有插入单词的业务逻辑(存库、校验等)写在这里 // 插入完成后触发回调,通知外层页面刷新列表 OnWordInserted?.Invoke(); } }
第二步:修改MyWordPage后台代码
首先把原来的List<string>数据源换成ObservableCollection<string>——普通List不支持集合变更通知,就算修改数据UI也不会自动更新。初始化MyAddWordPage实例时,把当前页的刷新方法绑定到它的回调属性上,同时修正你原有代码里的逻辑问题:
public partial class MyWordPage : ContentPage { // 改用支持变更通知的集合做数据源,增删条目时UI自动刷新 private readonly ObservableCollection<string> _wordList = new ObservableCollection<string>() { "New York", "London", "Mumbai", "Chicago" }; private bool _isAddViewShown = false; public MyWordPage() { InitializeComponent(); // 初始化添加单词页,绑定刷新回调 var addWordPage = new MyAddWordPage { OnWordInserted = OnUpdateMyList }; AddWordsView.Content = addWordPage.Content; // 绑定列表数据源,修正原代码中列表默认隐藏的问题 ListOfWords.ItemsSource = _wordList; ListOfWords.IsVisible = true; } // 视图切换逻辑可以简化,不用写重复分支 void OnChangeViewButton(System.Object sender, System.EventArgs e) { _isAddViewShown = !_isAddViewShown; AddWordsView.IsVisible = _isAddViewShown; MyWordListView.IsVisible = !_isAddViewShown; } private void OnUpdateMyList() { // 这里写你原有的列表刷新逻辑即可 // 比如重新读取本地存储的单词列表,对_wordList做增删替换操作,UI会自动同步 } }
原有代码需要注意的问题
- XAML中
ListOfWords默认设置了IsVisible="False",和你启动默认显示单词列表的需求冲突,要么像上面代码一样在后台设为true,要么直接改XAML里的属性值 - 不要用
new MyAddWordPage().Content这种直接取Content的写法,要先持有MyAddWordPage的实例再赋值Content,不然回调会因为实例被回收失效 - 两个视图的可见性是严格互斥的,切换逻辑直接用布尔值取反即可,减少重复代码
内容的提问来源于stack exchange,提问作者hk77
相关产品推荐
相关产品推荐

