Powershell - INotifyPropertyChanged可以原生实现吗?

时间:2014-02-16 17:03:43

标签: powershell inotifypropertychanged

有没有人知道是否可以在Powershell中的对象上本地实现INotifyPropertyChanged接口,而无需构建C#类并使用Add-Type生成新的.NET程序集?

我用Google搜索了我能想到的所有内容,但却无法找到解决方案。

感谢。

2 个答案:

答案 0 :(得分:2)

我正在尝试使用 Powershell 加载我的 WPF 原型,并且遇到了同样的情况,到目前为止我发现解决方案非常简单,它包括向 powershell 类添加接口方法,最后要处理的是 CanExecuteChanged事件,通过异常消息它说方法 add_CanExecuteChanged 没有找到,解决方法很简单,添加事件添加器和移除器,对于 e

 class Relay: System.Windows.Input.ICommand {
    [Action[object]]$command;
    
    Relay([Action[object]]$Command){
        $this.command = $Command;
    }

    [void]add_CanExecuteChanged ([System.EventHandler]$handler){}
    [void]remove_CanExecuteChanged ([System.EventHandler]$handler){}

    [bool]CanExecute([object]$arg) {return  $true; }
    [void]Execute ([object]$arg){ $this.command?.Invoke($arg); }
}

对于 INotifyPropertyChanged,情况有所不同,因为它需要 getter 和 setter,并且需要在 setter 上调用 PropertyChanged 处理程序,powershell 中的属性可以在 C# 中实现为字段,并且在后台 powershell 添加 get_* 和 set_,这是在 dotnet 中在 ggenerated IL 中添加属性时的情况,您发现 get_、set_* 方法代表 getter 和 setter,例如:

class Demo {
    [string]$MyProperty;
}

如果你对结果中的一个实例执行 Get-Member -Force 你会发现 (get_MyProperty, set_MyProperty) 方法,但是当我尝试这样做时“例如在 java 中”方法不会执行,但是我尝试在没有这些方法的情况下进行绑定,效果很好,这是我的实验要点,绑定以两种方式工作:

https://gist.github.com/mouadcherkaoui/7b0f32d9dbefa71102acdbb07299c9bb

这里是我修改的源代码,它本身包含很多好的脚本:

https://github.com/SammyKrosoft/PowerShell/blob/master/How-To-Load-WPF-From-XAML.ps1

此致。

答案 1 :(得分:1)

没有。将PowerShell视为CLI consumer语言,而不是producer语言。那就是你可以构造和使用大多数.NET类型。但是,PowerShell本身并不提供创建新.NET类型的工具,更不用说实现接口的类型。虽然您可以在PowerShell中创建自定义对象并使用技巧为这些对象提供PowerShell可以理解的类型名称,但这些技巧不适用于WPF等.NET库。