PowerShell 可观察集合事件

问题描述 投票:0回答:1

我正在尝试在 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”的事件不存在。

powershell events observablecollection
1个回答
0
投票

看起来您需要创建一个支持属性更改的类,因此您可以执行以下操作:

$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 事件)。

© www.soinside.com 2019 - 2024. All rights reserved.