You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:36:17