ListItems 仅在 window 调整大小后显示
ListItems only show after window is resized
我从包含 ListView 的 PowerShell 创建了一个 window。 ListView 通过绑定从 ItemsSource 获取其项目。列表被填满没有问题,但是当所有完成后,listviewitems 不显示。它们仅在我调整 window.
大小时显示
如果我再次 运行 也是如此,只有在我调整 window 大小后才会显示任何新项目。
XAML:
<ListView Grid.Column="0" Name="Lv1">
<ListView.View>
<GridView>
<GridViewColumn Header="N" DisplayMemberBinding="{Binding Name}" Width="200"/>
<GridViewColumn Header="I" DisplayMemberBinding="{Binding LastWriteTime}" Width="150"/>
</GridView>
</ListView.View>
</ListView>
PowerShell,我尝试使用 PSCustomObject、PSObject、哈希表,但结果相同:
$Something = { param( $syncHash )
# Gather stuff in $t
$syncHash.DataContext[4].Add( [pscustomobject]@{ Name = $t.Name; LastWriteTime = $t.LastWriteTime } )
}
$syncHash = [hashtable]::Synchronized(@{})
$syncHash.Window = [Windows.Markup.XamlReader]::Load( ( New-Object System.Xml.XmlNodeReader ( [xml]( Get-Content .\tt.xml ) ) ) )
$syncHash = [hashtable]::Synchronized(@{})
$Bindings = New-Object System.Collections.ArrayList
$Lv1Source = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
$Lv2Source = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
0.0, 0.0, "", 0.0, $Lv1Source, $Lv2Source | foreach { $syncHash.DataContext.Add( $_ ) }
$syncHash.Button.Add_Click( {
( [powershell]::Create().AddScript( $Something ).AddArgument( $syncHash ) ).BeginInvoke()
} )
$syncHash.Window.DataContext = $syncHash.DataContext
0..( $syncHash.DataContext.Count - 1 ) | foreach { [void]$Bindings.Add( ( New-Object System.Windows.Data.Binding -ArgumentList "[$_]" ) ) }
$Bindings | foreach { $_.Mode = [System.Windows.Data.BindingMode]::OneWay }
[void][System.Windows.Data.BindingOperations]::SetBinding( $syncHash.Lv1, [System.Windows.Controls.ListView]::ItemsSourceProperty, $Bindings[4] )
[void][System.Windows.Data.BindingOperations]::SetBinding( $syncHash.Lv2, [System.Windows.Controls.ListView]::ItemsSourceProperty, $Bindings[5] )
$syncHash.DataContext[4].Add( [pscustomobject]@{Name=$t.Name;LastWriteTime=$t.LastWriteTime } )
感谢最后一个 post here,“在运行空间之间调用时,我们需要使用 'Dispatcher'”。
总之,DataContext是通过syncHash更新的,但是在button-click的脚本块中,我需要使用:
$syncHash.Window.Dispatcher.Invoke( [action] {
$syncHash.Lv1.Items.Refresh()
$syncHash.DataContext[5].Add( [pscustomobject]@{ Name = $syncHash.h[$syncHash.ti] ; LastWriteTime = ( Get-Date ) } )
} )
我从包含 ListView 的 PowerShell 创建了一个 window。 ListView 通过绑定从 ItemsSource 获取其项目。列表被填满没有问题,但是当所有完成后,listviewitems 不显示。它们仅在我调整 window.
大小时显示如果我再次 运行 也是如此,只有在我调整 window 大小后才会显示任何新项目。
XAML:
<ListView Grid.Column="0" Name="Lv1">
<ListView.View>
<GridView>
<GridViewColumn Header="N" DisplayMemberBinding="{Binding Name}" Width="200"/>
<GridViewColumn Header="I" DisplayMemberBinding="{Binding LastWriteTime}" Width="150"/>
</GridView>
</ListView.View>
</ListView>
PowerShell,我尝试使用 PSCustomObject、PSObject、哈希表,但结果相同:
$Something = { param( $syncHash )
# Gather stuff in $t
$syncHash.DataContext[4].Add( [pscustomobject]@{ Name = $t.Name; LastWriteTime = $t.LastWriteTime } )
}
$syncHash = [hashtable]::Synchronized(@{})
$syncHash.Window = [Windows.Markup.XamlReader]::Load( ( New-Object System.Xml.XmlNodeReader ( [xml]( Get-Content .\tt.xml ) ) ) )
$syncHash = [hashtable]::Synchronized(@{})
$Bindings = New-Object System.Collections.ArrayList
$Lv1Source = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
$Lv2Source = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
0.0, 0.0, "", 0.0, $Lv1Source, $Lv2Source | foreach { $syncHash.DataContext.Add( $_ ) }
$syncHash.Button.Add_Click( {
( [powershell]::Create().AddScript( $Something ).AddArgument( $syncHash ) ).BeginInvoke()
} )
$syncHash.Window.DataContext = $syncHash.DataContext
0..( $syncHash.DataContext.Count - 1 ) | foreach { [void]$Bindings.Add( ( New-Object System.Windows.Data.Binding -ArgumentList "[$_]" ) ) }
$Bindings | foreach { $_.Mode = [System.Windows.Data.BindingMode]::OneWay }
[void][System.Windows.Data.BindingOperations]::SetBinding( $syncHash.Lv1, [System.Windows.Controls.ListView]::ItemsSourceProperty, $Bindings[4] )
[void][System.Windows.Data.BindingOperations]::SetBinding( $syncHash.Lv2, [System.Windows.Controls.ListView]::ItemsSourceProperty, $Bindings[5] )
$syncHash.DataContext[4].Add( [pscustomobject]@{Name=$t.Name;LastWriteTime=$t.LastWriteTime } )
感谢最后一个 post here,“在运行空间之间调用时,我们需要使用 'Dispatcher'”。
总之,DataContext是通过syncHash更新的,但是在button-click的脚本块中,我需要使用:
$syncHash.Window.Dispatcher.Invoke( [action] {
$syncHash.Lv1.Items.Refresh()
$syncHash.DataContext[5].Add( [pscustomobject]@{ Name = $syncHash.h[$syncHash.ti] ; LastWriteTime = ( Get-Date ) } )
} )