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

为何static关键字会影响MAUI中CollectionView的运行?

问题原因分析

你遇到的问题是由以下几个关键问题共同导致的:

  1. BindingContext实例重复创建
    你的XAML中已经通过<vm:IndexTest/>创建了一个IndexTest实例作为页面的BindingContext,但如果你的页面代码后台(Index.xaml.cs)的构造函数里又手动执行了BindingContext = new IndexTest();,就会出现两次实例化的情况:

    • 第一次实例化(XAML中):构造函数执行Testing.Add(...),给集合添加了元素
    • 第二次实例化(代码后台):直接替换掉了原来的BindingContext,新实例的集合(非static时)是空的,所以页面加载完成后显示为空
      而使用static关键字时,所有IndexTest实例的Testing属性都指向同一个全局静态集合,所以第二次实例化的集合里也会保留第一次添加的元素,因此能正常显示。
  2. 绑定路径拼写错误
    你的XAML中CollectionView的ItemsSource绑定的是{Binding Test},但ViewModel中的属性名称是Testing,这是明显的拼写错误。正常情况下这个绑定会直接失败,但因为静态集合是全局共享的,可能被意外引用到,才让你误以为绑定正常。

  3. 属性变更通知参数错误
    ViewModel中Testing属性的set方法里,OnPropertyChanged(nameof(Test))传递的参数错误,应该是nameof(Testing)(属性名称),而不是nameof(Test)(实体类名称)。虽然这个错误不会影响集合元素的添加(因为ObservableCollection本身会通知元素变化),但属于规范问题,需要修正。

修复方案
  1. 统一BindingContext的实例化方式
    只保留一种BindingContext设置方式即可:要么保留XAML中的<vm:IndexTest/>声明,要么在代码后台设置,不要重复操作。比如删除代码后台中手动设置BindingContext的代码,仅保留XAML的声明。

  2. 修正绑定路径
    将XAML中CollectionView的绑定改为正确的属性名:

    <CollectionView ItemsSource="{Binding Testing}">
    
  3. 修正属性变更通知
    把ViewModel中set方法的通知参数改对:

    set { _testing = value; OnPropertyChanged(nameof(Testing)); }
    
  4. 移除不必要的static关键字
    完成以上修正后,就可以安全移除_testing字段的static关键字,每个IndexTest实例会拥有独立的集合,不会再出现元素消失的问题。

内容的提问来源于stack exchange,提问作者Jackie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:06:27