有没有人知道是否可以在Powershell中的对象上本地实现INotifyPropertyChanged接口,而无需构建C#类并使用Add-Type生成新的.NET程序集?
我用Google搜索了我能想到的所有内容,但却无法找到解决方案。
感谢。
答案 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库。