Fox*_*loy 7 c# wpf powershell xaml
我在这里找到了许多很棒的主题,但似乎无法追查我的答案.我正在使用Visual Studio制作GUI并将XAML复制/粘贴到PowerShell中.我知道我应该在c#中这样做,但是因为我的知识还没有,所以对我来说它是纯粹的PowerShell.
所以我已经制作了我的GUI,但我似乎无法填充我的数据字段.做其他事情,如文本框是可以解决的,但我似乎无法让这个listview /数据网格填充值.
此时,已删除与Azure的连接,直到我可以解决将项目添加到列表框的问题.
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>
'@
Run Code Online (Sandbox Code Playgroud)
将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)}
Run Code Online (Sandbox Code Playgroud)
#Try to setup a dummy entry
$vmpicklistView.items.Add( @{'VMName'='1';Status="AccessDenied";'Other'='1'})
#===========================================================================
# Shows the form
#===========================================================================
$Form.ShowDialog() | out-null
Run Code Online (Sandbox Code Playgroud)
正如你从我的屏幕截图中看到的那样,当我添加一个绑定到列(我认为会实例化列并允许我为它们插入值... nope)时,当我尝试添加新项目时它们不再更新.但是,我没有应用绑定的"其他"列至少显示了一些输出,但它错误地列出了Collection,就好像它试图显示整个哈希表一样.
所以,我的最后一个问题是,如何将项目添加到列表视图?
好吧,我想出了答案.事实证明,当我使用.Add时,我应该将PowerShell自定义对象指定为我的重载,而不是像以前那样简单的哈希表.当我将代码更改为以下内容时:
#Add DisplayMemberBindings for all columns
<GridViewColumn Header="VMName" DisplayMemberBinding ="{Binding VMName}"/>
<GridViewColumn Header="Status" DisplayMemberBinding ="{Binding Status}"/>
<GridViewColumn Header="Other" DisplayMemberBinding ="{Binding Other}"/>
Run Code Online (Sandbox Code Playgroud)
然后修改我的Add语句:
$vmpicklistView.items.Add([pscustomobject]@{'VMName'='1';Status="Access Denied";Other="Yes"})
Run Code Online (Sandbox Code Playgroud)
我能够填充我的田地,就像这样
#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"})}
}
Run Code Online (Sandbox Code Playgroud)
我为什么要这样做?
以下是我为何需要这样做的解释.PowerShell自定义对象提供了一个具有命名值的Object,我可以使用绑定来提取,而hashtable是一个Key/Value对的集合,不太适合这个目的.
我希望这个答案能帮助那些像我一样难倒的人!
归档时间: |
|
查看次数: |
6185 次 |
最近记录: |