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

.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));
}

问题核心原因:

  1. List无集合内部变更通知能力:List<string>是普通集合,没有实现INotifyCollectionChanged接口——这个接口是CollectionView这类控件用来监听集合内部元素增删改的关键。你手动调用OnPropertyChanged(nameof(Items)),只会通知UI「Items属性的引用发生了变化」,但实际上你只是往原集合里添加元素,集合本身的引用没改变,所以CollectionView不会触发刷新。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:35:17