微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ListItems仅在调整窗口大小后显示

如何解决ListItems仅在调整窗口大小后显示

我从PowerShell创建一个包含ListView的窗口。 ListView通过绑定从ItemsSource获取其项目。列表可以毫无问题地填充,但是完成所有操作后,不会显示listviewitems。它们仅在我调整窗口大小时显示

如果再次运行该命令也是如此,所有新项目仅在调整窗口大小后才会显示

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,"",$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,$Bindings[5] )

$syncHash.DataContext[4].Add( [pscustomobject]@{Name=$t.Name;LastWriteTime=$t.LastWriteTime } )

解决方法

由于上一篇文章here,“在运行空间之间进行调用时,我们需要使用'Dispatcher'”。

最后,DataContext是通过syncHash更新的,但是在单击按钮的脚本块中,我需要使用:

$syncHash.Window.Dispatcher.Invoke( [action] {
$syncHash.Lv1.Items.Refresh()
$syncHash.DataContext[5].Add( [pscustomobject]@{ Name = $syncHash.h[$syncHash.ti] ; LastWriteTime = ( Get-Date ) } )
} )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。