在 PowerShell 中使用 XAML/WPF,如何填充列表框? [英] Using XAML/WPF in PowerShell, how do I populate a list box?

查看:48
本文介绍了在 PowerShell 中使用 XAML/WPF,如何填充列表框?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这里找到了许多很棒的主题,但似乎无法找到我的答案.我正在使用 Visual Studio 制作 GUI 并将 XAML 复制/粘贴到 PowerShell 中.我知道我应该用 c# 来做这件事,但由于我的知识还不存在,它对我来说是纯粹的 PowerShell.

I've found a number of great threads here but can't seem to track down my answer. I'm making a GUI using Visual Studio and copy/pasting the XAML into PowerShell. I know I should be doing this in c#, but as my knowledge isn't there yet, it's pure PowerShell for me.

所以我已经制作了 GUI,但我似乎无法填充我的数据字段.做其他事情,比如文本框是可以解决的,但我似乎无法让这个列表视图/数据网格填充值.

So I've got my GUI made, but I can't seem to populate my data fields. Doing other things like textboxes were solvable, but I can't seem to get this listview / data grid to populate with values.

此时,与 Azure 的连接已被移除,直到我可以解决将项目添加到列表框中的问题.

At this moment, the connection to Azure has been removed, until I can resolve this hitch of adding items to my list box.

XAML 来绘制我的表单

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @'
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Azure"
        Title="Azure Accelerator" Height="300" Width="315">
    <Grid Margin="0,0,174,0">
        <Image Name="image" HorizontalAlignment="Left" Height="46" Margin="10,10,-97,0" VerticalAlignment="Top" Width="210" Source="C:\Users\stephen\Dropbox\My Code\Powershell\WPF\mslogo.png"/>
        <TextBlock Name="textBlock" HorizontalAlignment="Left" Height="21" Margin="10,61,-140,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="248" Text="VM PickerUse"/>
        <Button Name="btnOK" Content="OK" HorizontalAlignment="Left" Margin="217,268,-160,0" VerticalAlignment="Top" Width="75" Height="23"/>
        <Button Name="btnExit" Content="Cancel" HorizontalAlignment="Left" Margin="12,268,0,0" VerticalAlignment="Top" Width="75" Height="23"/>
        <ListView Name="listView" HorizontalAlignment="Left" Height="108" Margin="12,107,-140,0" VerticalAlignment="Top" Width="246">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="VMName" DisplayMemberBinding ="{Binding VMName}"/>
                    <GridViewColumn Header="Status" DisplayMemberBinding ="{Binding Status}"/>
                    <GridViewColumn Header="Other"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>
'@

将 XAML 加载到内存中/制作对象

#Read XAML

$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}
catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."}

#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================

$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "VMpick$($_.Name)" -Value $Form.FindName($_.Name)}

我可能需要帮助的地方

#Try to setup a dummy entry
$vmpicklistView.items.Add( @{'VMName'='1';Status="AccessDenied";'Other'='1'})

#===========================================================================
# Shows the form
#===========================================================================
$Form.ShowDialog() | out-null

正如您从我的屏幕截图中看到的,当我向列添加绑定时(我认为这会实例化列并让我为它们插入值...不)当我尝试添加时它们不再更新一个新项目.然而,我没有应用绑定的其他"列至少显示了 someput,但它错误地列出了 Collection,好像它试图显示整个哈希表.

As you can see from my screen shot, when I added a binding to the columns (which I thought would instantiate the columns and let me plug in values for them...nope) they no longer update when I try to add a new item. However, the 'Other' column, which I did not apply the binding to, does at least show someput, but it incorrectly lists Collection, as if it is trying to display the whole hashtable.

那么,我的最后一个问题是,如何将项目添加到列表视图中?

So, my final question, how do I add items to a listview?

推荐答案

好的,我找到了答案.事实证明,当我使用 .Add 时,我应该指定一个 PowerShell 自定义对象作为我的重载,而不是像我之前所做的那样一个简单的哈希表.当我将代码更改为以下内容时:

Alright, I figured out the answer. It turns out that when I was using .Add, I should have been specifying a PowerShell custom object as my overload, not a simple hashtable as I was doing before. When I changed my code to the following:

#Add DisplayMemberBindings for all columns
<GridViewColumn Header="VMName" DisplayMemberBinding ="{Binding VMName}"/>
<GridViewColumn Header="Status" DisplayMemberBinding ="{Binding Status}"/>
<GridViewColumn Header="Other" DisplayMemberBinding ="{Binding Other}"/>

然后也修改我的 Add 语句:

And then modify my Add statement as well:

$vmpicklistView.items.Add([pscustomobject]@{'VMName'='1';Status="Access Denied";Other="Yes"})

我可以像这样填充我的字段

I'm able to populate my fields, like so

#Make Dummy Entries 
1..15 | % {
if ($_ % 2){$vmpicklistView.items.Add([pscustomobject]@{'VMName'="VM_$($_)";Status="Online";Other="Yes"})}
else{$vmpicklistView.items.Add([pscustomobject]@{'VMName'="VM_$($_)";Status="Access Denied";Other="Yes"})}
}

为什么我必须这样做?

这是我对为什么需要这样做的解释.PowerShell 自定义对象提供了一个带有命名值的对象,我可以使用绑定来提取它,而哈希表是键/值对的集合,不太适合此目的.

Here is my interpretation as to why this was needed. PowerShell Custom Objects provide an Object with Named values, which I can pluck out using bindings, while a hashtable is a collection of Key/Value pairs, not well suited for this purpose.

我希望这个回答能帮助到像我一样被难住的人!

I hope this answer has helped anyone else who got stumped as I did!

这篇关于在 PowerShell 中使用 XAML/WPF,如何填充列表框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆