.NET MAUI中OnPropertyChanged无法更新CollectionView的原因
点击按钮后Label更新但CollectionView不更新的原因分析
界面控件代码:
<CollectionView ItemsSource="{Binding Items}" /> <Button Text="Add an item" Command="{Binding AddItemCommand}" /> <Label Text="{Binding Items.Count}" /> <Label Text="{Binding Items.Capacity}" />
视图模型代码:
public List<string> Items { get; set; } = new(); [RelayCommand] void AddItem() { Items.Add("item"); OnPropertyChanged(nameof(Items)); }
问题核心原因:
- List
无集合内部变更通知能力 :List<string>是普通集合,没有实现INotifyCollectionChanged接口——这个接口是CollectionView这类控件用来监听集合内部元素增删改的关键。你手动调用OnPropertyChanged(nameof(Items)),只会通知UI「Items属性的引用发生了变化」,但实际上你只是往原集合里添加元素,集合本身的引用没改变,所以CollectionView不会触发刷新。 - Label能更新的逻辑:Label绑定的是
Items.Count和Items.Capacity这两个集合属性,当你触发Items的PropertyChanged时,UI会重新读取这两个属性的当前值,因此能显示最新的数量和容量。
解决方法:
把List<string>替换为ObservableCollection<string>,它内置实现了INotifyCollectionChanged接口,集合内部元素变化时会自动通知UI更新,无需手动触发OnPropertyChanged:
public ObservableCollection<string> Items { get; set; } = new(); [RelayCommand] void AddItem() { Items.Add("item"); // 无需再调用OnPropertyChanged(nameof(Items)) }
修改后点击按钮添加元素时,CollectionView会自动感知集合变化,实时刷新显示新元素。
内容的提问来源于stack exchange,提问作者Markiian Khylynskyi
相关产品推荐
相关产品推荐

