如何向NotifyPropertyChanged方法告知无显式名称的索引器属性变更
实现方案
索引器的属性变更通知可以通过指定格式的属性名字符串实现,.NET 平台默认索引器对应的属性名为Item,通知单个索引位置变更的字符串格式为 Item[索引值],适配你使用的 Xamarin.Forms 绑定规则。
1. 修改通知方法
将你的NotifyPropertyChanged方法修改为如下实现即可:
private void NotifyPropertyChanged(int index = 0) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs($"Item[{index}]")); }
调用示例:需要通知索引7的位置变更时,执行NotifyPropertyChanged(7)即可触发XAML中{Binding [7]}对应的绑定更新。
2. 其他场景用法
- 通知所有索引器项变更:传入属性名
Item[] - 如果你通过
[IndexerName]特性自定义了索引器名称,替换上述字符串中的Item为你自定义的名称即可 - 通知所有属性变更:直接传入空字符串即可
优化建议
- 先修正现有代码的语法错误:
Placeholder类的构造函数中resourceID大小写不匹配,需要和参数名一致改为resourceId - 如果需要直接通过索引器修改资源ID,可以给索引器添加set访问器,赋值时自动触发通知:
public string this[int index] { get => List[index].ResourceId; set { if (List[index].ResourceId != value) { List[index].ResourceId = value; NotifyPropertyChanged(index); } } }
- 如果后续需要直接修改
List中Placeholder实例的ResourceId属性,需要让Placeholder类也实现INotifyPropertyChanged接口,否则修改ResourceId时不会自动触发UI更新。
内容的提问来源于stack exchange,提问作者Luca Hafer
相关产品推荐
相关产品推荐

