PowerShell中Observable Collection注册PropertyChanged事件失败求助
问题原因
ObservableCollection<T> 仅实现了 INotifyCollectionChanged 接口,仅提供 CollectionChanged 事件用于监听集合元素的增删、重置等操作;它没有实现 INotifyPropertyChanged 接口,因此不存在 PropertyChanged 事件,这就是 Register-ObjectEvent 报错的直接原因。
解决方案
根据实际需求,分两种场景处理:
场景1:监听集合中元素的属性变化
如果目标是监听集合内元素的属性变更(而非集合对象自身的属性),需要为每个实现了 INotifyPropertyChanged 的元素单独注册事件,同时结合 CollectionChanged 为后续新增的元素自动注册:
# 为现有元素注册PropertyChanged事件 foreach ($item in $MyObservableCollection) { if ($item -is [System.ComponentModel.INotifyPropertyChanged]) { Register-ObjectEvent -InputObject $item -EventName PropertyChanged -Action { Write-Host "元素属性变更:属性名=$($EventArgs.PropertyName),旧值=$($EventArgs.OldValue),新值=$($EventArgs.NewValue)" } | Out-Null } } # 监听集合变更,为新增元素自动注册事件 Register-ObjectEvent -InputObject $MyObservableCollection -EventName CollectionChanged -Action { foreach ($newItem in $EventArgs.NewItems) { if ($newItem -is [System.ComponentModel.INotifyPropertyChanged]) { Register-ObjectEvent -InputObject $newItem -EventName PropertyChanged -Action { Write-Host "元素属性变更:属性名=$($EventArgs.PropertyName),旧值=$($EventArgs.OldValue),新值=$($EventArgs.NewValue)" } | Out-Null } } } | Out-Null
场景2:监听集合对象自身的属性变化
ObservableCollection<T> 自身的可写属性极少(如 Count、IsReadOnly 均为只读),若确实需要监听自定义属性的变更,需封装一个继承自 ObservableCollection<T> 并实现 INotifyPropertyChanged 的子类:
# 加载自定义集合类 Add-Type @" using System; using System.Collections.ObjectModel; using System.ComponentModel; public class ObservableCollectionWithPropertyChanged<T> : ObservableCollection<T>, INotifyPropertyChanged { // 示例自定义可修改属性 private string _customProperty; public string CustomProperty { get => _customProperty; set { if (_customProperty != value) { _customProperty = value; OnPropertyChanged(new PropertyChangedEventArgs(nameof(CustomProperty))); } } } public new event PropertyChangedEventHandler PropertyChanged; protected override void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChanged?.Invoke(this, e); base.OnPropertyChanged(e); } } "@ # 创建自定义集合实例 $MyObservableCollection = New-Object ObservableCollectionWithPropertyChanged[string] $MyObservableCollection.Add("测试项") # 注册PropertyChanged事件监听集合自身属性变化 Register-ObjectEvent -InputObject $MyObservableCollection -EventName PropertyChanged -Action { Write-Host "集合属性变更:属性名=$($EventArgs.PropertyName),新值=$($MyObservableCollection.$($EventArgs.PropertyName))" } | Out-Null # 测试触发事件 $MyObservableCollection.CustomProperty = "新属性值"
内容的提问来源于stack exchange,提问作者chrisdotknee
相关产品推荐
相关产品推荐

