我正在尝试在 PowerShell 中为可观察集合注册 PropertyChanged 事件,但没有成功。这对于 CollectionChanged 事件来说效果很好。
这有效:
Register-ObjectEvent -InputObject $MyObservableCollection -EventName CollectionChanged -Action {Write-Host "Collection changed!"}`
虽然这不起作用:
Register-ObjectEvent -InputObject $MyObservableCollection -EventName PropertyChanged -Action {Write-Host "Property changed!"}`
我收到的错误如下:
Register-ObjectEvent :无法注册指定事件。一个 名称为“PropertyChanged”的事件不存在。
看起来您需要创建一个支持属性更改的类,因此您可以执行以下操作:
$PersonClass = @'
using System.ComponentModel;
public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
private string _Age;
public string Age
{
get { return _Age; }
set
{
_Age = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Age"));
}
}
private string _Country;
public string Country
{
get { return _Country; }
set
{
_Country = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Country"));
}
}
}
'@
Add-Type -TypeDefinition $PersonClass -Language 'CSharp'
$NewPerson = [Person]::New()
$MyObservableCollection = New-Object -TypeName System.Collections.ObjectModel.ObservableCollection[System.Collections.ArrayList]
Register-ObjectEvent -InputObject $NewPerson -EventName PropertyChanged -Action {Write-Host "PropertyChanged on item"}
Register-ObjectEvent -InputObject $MyObservableCollection -EventName CollectionChanged -Action {Write-Host "Item added or removed"}
$MyObservableCollection.Add(@($NewPerson))
$NewPerson.Name = 'Joe Bloggs'
这里我们创建一个 Person 类,它存储一个人的属性,如姓名、年龄和国家/地区,每个属性都有一个 PopertyChangedEventHandler。然后,您将创建一个可观察的数组列表,以便您可以从列表中添加/删除单个人员(这将触发 CollectionChanged 事件)。