为何static关键字会影响MAUI中CollectionView的运行?
你遇到的问题是由以下几个关键问题共同导致的:
BindingContext实例重复创建
你的XAML中已经通过<vm:IndexTest/>创建了一个IndexTest实例作为页面的BindingContext,但如果你的页面代码后台(Index.xaml.cs)的构造函数里又手动执行了BindingContext = new IndexTest();,就会出现两次实例化的情况:- 第一次实例化(XAML中):构造函数执行
Testing.Add(...),给集合添加了元素 - 第二次实例化(代码后台):直接替换掉了原来的BindingContext,新实例的集合(非static时)是空的,所以页面加载完成后显示为空
而使用static关键字时,所有IndexTest实例的Testing属性都指向同一个全局静态集合,所以第二次实例化的集合里也会保留第一次添加的元素,因此能正常显示。
- 第一次实例化(XAML中):构造函数执行
绑定路径拼写错误
你的XAML中CollectionView的ItemsSource绑定的是{Binding Test},但ViewModel中的属性名称是Testing,这是明显的拼写错误。正常情况下这个绑定会直接失败,但因为静态集合是全局共享的,可能被意外引用到,才让你误以为绑定正常。属性变更通知参数错误
ViewModel中Testing属性的set方法里,OnPropertyChanged(nameof(Test))传递的参数错误,应该是nameof(Testing)(属性名称),而不是nameof(Test)(实体类名称)。虽然这个错误不会影响集合元素的添加(因为ObservableCollection本身会通知元素变化),但属于规范问题,需要修正。
统一BindingContext的实例化方式
只保留一种BindingContext设置方式即可:要么保留XAML中的<vm:IndexTest/>声明,要么在代码后台设置,不要重复操作。比如删除代码后台中手动设置BindingContext的代码,仅保留XAML的声明。修正绑定路径
将XAML中CollectionView的绑定改为正确的属性名:<CollectionView ItemsSource="{Binding Testing}">修正属性变更通知
把ViewModel中set方法的通知参数改对:set { _testing = value; OnPropertyChanged(nameof(Testing)); }移除不必要的static关键字
完成以上修正后,就可以安全移除_testing字段的static关键字,每个IndexTest实例会拥有独立的集合,不会再出现元素消失的问题。
内容的提问来源于stack exchange,提问作者Jackie

