使用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
相关产品推荐
相关产品推荐

