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

使用NotifyPropertyChangedFor源生成器时ObservableCollection无法更新UI的问题

MVVM CommunityToolkit 集合相关问题解答

你提供的代码如下:

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Count))]
public ObservableCollection<TODO> todos = new();

public int Count => Todos.Count;

针对你的三个问题逐一解答:

1. 为什么向Todos添加元素时,[NotifyPropertyChangedFor(nameof(Count))]无法更新UI中的Count?正确实现方式是什么?

[NotifyPropertyChangedFor]的触发条件是**Todos属性本身的引用被替换**(比如执行Todos = new ObservableCollection<TODO>()),而调用Add/Remove等集合操作时,Todos的引用没有变化,所以这个特性不会触发Count的属性变更通知,UI自然不会更新。

正确实现:
利用MVVM CommunityToolkit生成的OnTodosInitialized方法,订阅集合的CollectionChanged事件,在集合元素变化时手动触发Count的属性变更通知:

partial void OnTodosInitialized()
{
    Todos.CollectionChanged += (s, e) => OnPropertyChanged(nameof(Count));
}

这样每次集合内元素增删、重置时,都会通知UI更新Count的值。

2. 为什么添加元素时OnTodosChanged方法不会被调用?

OnTodosChanged是MVVM CommunityToolkit为[ObservableProperty]生成的属性变更回调,它只会在**Todos属性的引用被替换**时触发(比如给Todos赋值新的集合实例)。调用Add/Remove只是修改集合内部的元素,没有改变Todos本身的引用,所以这个方法不会被触发。

3. 执行Todos[0].IsCompleted = true这类操作时,UI会更新吗?若不会,该如何处理?

  • 如果TODO类实现了INotifyPropertyChanged接口(比如继承MVVM CommunityToolkit的ObservableObject基类),那么UI会自动更新;
  • 如果TODO类没实现该接口,UI不会更新。

处理方式:给TODO类添加属性变更通知支持,最简单的方式是继承ObservableObject并使用[ObservableProperty]特性:

public partial class TODO : ObservableObject
{
    [ObservableProperty]
    private bool isCompleted;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:09