使用 PowerShell 数据绑定创建动态列表框

Using PowerShell Data Binding to create a dynamic ListBox

我想在 PowerShell 中创建一个 WPF 列表框,而不加载任何硬 XAML(类似于下图),当箭头按钮是时,它使用数据绑定将数据从一个列表框移动到另一个列表框点击。我仍处于编码阶段的早期阶段,很难概念化如何将各种数据绑定组件配置在一起。

  1. 哈希 Table: 是否必须为两个列表框创建单独的 $hash table(和相应的 $DataContext)?
  2. 绑定:绑定与在列表框之间移动数据有何关系?绑定仍然是单向的还是双向的?或者这仅仅是按钮操作两个 ListBox 彼此独立的问题?
  3. 在这种情况下,$Binding.Path 的示例是什么?

我将 om hashtable 和 ObservableCollections 组合用于我的 WPF-gui。

首先是一个用于收集所有数据和绑定的哈希表。它是同步的,因此哈希表可以在多像素运行空间中使用。如果您想要不冻结的 GUI,有时需要这样做。

$syncHash = [hashtable]::Synchronized( @{} )

然后为每个目的收集

$syncHash.DataContext = New-Object System.Collections.ObjectModel.ObservableCollection[Object]

在这个集合中,我放置了与我将绑定到的内容相对应的值。我喜欢将索引和目的作为评论保留在最后,以便稍后再回过头来。稍后需要索引。

$syncHash.DataContext.Add( ( New-Object System.Collections.ObjectModel.ObservableCollection[Object] ) ) # 1 All files

现在是创建绑定对象的时候了。 “Window”是 WPF-window 对象的变量名称。

$Bindings = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
0..( $syncHash.DataContext.Count - 1 ) | foreach { [void]$Bindings.Add( ( New-Object System.Windows.Data.Binding -ArgumentList "[$_]" ) ) }
$Bindings | foreach { $_.Mode = [System.Windows.Data.BindingMode]::TwoWay }
$syncHash.Window.DataContext = $syncHash.DataContext

现在我们对控件及其属性进行绑定。这里我们需要使用和之前一样的索引,控件的名称,控件的类型和属性名

[void][System.Windows.Data.BindingOperations]::SetBinding( $syncHash.lvAllFiles [System.Windows.Controls.ListView]::ItemsSourceProperty, $Bindings[1] )

要使用绑定,请调用集合名称和索引,然后设置所需的值。喜欢以下其中一项:

$syncHash.DataContext[1] = $List
$syncHash.DataContext[1] += "Text"
$syncHash.DataContext[1].Add( "Text" )

您如何使用它取决于您绑定到哪种值(控件的属性)and/or该索引处的 DataContext 集合中有什么。

如果您想为许多属性建立许多绑定,您还可以为每个控件建立单独的 DataContext 集合或不同的绑定集合。这将使管理更容易,但请记住绑定的名称 and/or 您将绑定到哪个集合。