如何创建一个 Powershell 布尔计算值 属性,其值可以被 WinForm 复选框识别?

How do you create a Powershell boolean Calculated Property with a value that can be recognised by a WinForm Checkbox?

在检索更大的数据集期间,我试图在 Powershell 中创建一个名为 'Checked' 的计算 属性,初始值为 $false:

$var = [System.Collections.ArrayList](@($dataSource | Select-Object -Unique -Property @{Name='Checked';Expression={$false}},ID,Name))

然后在从 Powershell 生成的 WinForm DataGridView 对象中可视化:

$bAnalysesDataGrid                       = [System.Windows.Forms.DataGridView]::new()
$bAnalysesDataGrid.location              = [System.Drawing.Size]::new((20*$w),(210*$h))
$bAnalysesDataGrid.width                 = 1960*$w
$bAnalysesDataGrid.height                = 600*$h

[void]$bAnalysesDataGrid.Columns.Add([System.Windows.Forms.DataGridViewCheckBoxColumn]::new())
[void]$bAnalysesDataGrid.Columns.Add([System.Windows.Forms.DataGridViewTextBoxColumn]::new())
[void]$bAnalysesDataGrid.Columns.Add([System.Windows.Forms.DataGridViewTextBoxColumn]::new())
$bAnalysesDataGrid.Columns[0].Name             = "Checked"
$bAnalysesDataGrid.Columns[0].DataPropertyName = "Checked"
$bAnalysesDataGrid.Columns[1].Name             = "ID"
$bAnalysesDataGrid.Columns[1].DataPropertyName = "ID"
$bAnalysesDataGrid.Columns[2].Name             = "Name"
$bAnalysesDataGrid.Columns[2].DataPropertyName = "Name"

$bAnalysesDataGrid.DataSource = $var

但是,当 'Checked' 属性 加载到第一列时,会出现以下错误,这表明 $false 正在作为字符串接收:

The following exception occurred in the DataGridView: System.FormatException: Value 'False' cannot be converted to type 'Boolean'.

如何创建一个与 CheckBox 一起使用的计算 属性,以 $false 值开始?我已经尝试了零、字符串和 $ 符号的各种组合,其中 none 似乎表现正确。

完整错误信息:

Windows Forms 中的数据绑定逻辑不太清楚如何正确调用 PowerShell 的扩展属性,因此计算属性、注释属性或 [pscustomobject] 成员无法很好地使用此方法.

相反,使用 class 关键字定义真正的 .NET 类型,然后成员绑定应该起作用:

class CheckableDataRow {
  [bool]$Checked
  [int]$ID
  [string]$Name
}

# fetch/construct data rows
$vars = $dataSource | Select-Object -Unique -Property @{Name='Checked';Expression={$false}},ID,Name 

# convert to CheckableDataRow's
$vars = $vars -as [CheckableDataRow[]]

# rest of the script remains the same...