Powershell集合视图

Powershell集合视图,powershell,collectionview,Powershell,Collectionview,我正在尝试使用XAML在WPF组合框中进行分组,我发现其中谈到了使用列表来驱动分组。但背后的示例代码当然不是Powershell,我花了很长时间摸索如何构建列表。有人能告诉我Powershell中CollectionView的好资源吗?我在C/C++/C#方面没有任何经验,但我希望Powershell最终成为一个门户网站 顺便说一句,我确实发现了这个,谈到了在XAML中进行集合视图,但是我的collectionView的内容将是动态的,所以我必须在代码中构建它 顺便说一句,最终目标是一个组合框,

我正在尝试使用XAML在WPF组合框中进行分组,我发现其中谈到了使用列表来驱动分组。但背后的示例代码当然不是Powershell,我花了很长时间摸索如何构建列表。有人能告诉我Powershell中CollectionView的好资源吗?我在C/C++/C#方面没有任何经验,但我希望Powershell最终成为一个门户网站 顺便说一句,我确实发现了这个,谈到了在XAML中进行集合视图,但是我的collectionView的内容将是动态的,所以我必须在代码中构建它

顺便说一句,最终目标是一个组合框,看起来像这样

Sets
   Arch
   MEP
   Viz

Packages
   RVT_2015
   RVT_2016
   MAX_2016
。。。其中,实际的集合和包是从一些用户自定义的XML中动态提取的,用户可以选择一个集合或一个包。试图用一个不令人沮丧的用户体验列出两个列表并强制执行一个选择,效果不佳。所以我认为一个单独的组合框可以很好地解决这个问题

编辑:继续前进

$locations = @('Amsterdam', 'Berlin', 'London')
$sets = @('Arch', 'MEP', 'Viz')
$packages = @('RVT_2015', 'RVT_2016', 'MAX_2016')

[xml]$xaml = @"
<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen" ResizeMode="NoResize"
    Width = "300" Height = "200" ShowInTaskbar = "True" Background = "lightgray"> 
    <StackPanel>
        <Label  Content="Define your job:" VerticalAlignment="Center" HorizontalAlignment="Left"  />
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>

            <Label Grid.Row="0" Grid.Column="0" Content="Location" VerticalAlignment="Center" HorizontalAlignment="Left"  />
            <ComboBox Name="Location" Width="200"  
                Grid.Row="0" Grid.Column="1"
                VerticalAlignment="Center" HorizontalAlignment="Right"
                VerticalContentAlignment="Center"  
                Margin="0,0,0,0">             
            </ComboBox>

            <Label Grid.Row="1" Grid.Column="0" Content="Target" VerticalAlignment="Center" HorizontalAlignment="Left"  />
            <ComboBox Name="Target"  
                Grid.Row="1" Grid.Column="1"
                VerticalAlignment="Center" HorizontalAlignment="Right"
                VerticalContentAlignment="Center" 
                Width="200" Margin="0,0,0,0">
                <ComboBox.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </ComboBox.GroupStyle>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"/>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </Grid>
    </StackPanel>
</Window>
"@

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$window=[Windows.Markup.XamlReader]::Load($reader)

$data = @() 
foreach ($target in $sets) {
    $data += New-Object PSObject -prop @{Name="$target";Category="Sets"}
}
foreach ($target in $packages) {
    $data += New-Object PSObject -prop @{Name="$target";Category="Packages"}
}

$listView = [System.Windows.Data.ListCollectionView]$data
$listView.GroupDescriptions.Add((new-object System.Windows.Data.PropertyGroupDescription "Category"))

$location = $window.findname("Location")
$location.ItemsSource = $locations

$target = $window.findname("Target")
$target.ItemsSource = $listView


$window.ShowDialog() | out-null
$locations=@(“阿姆斯特丹”、“柏林”、“伦敦”)
$sets=@('Arch','MEP','Viz')
$packages=@('RVT_2015'、'RVT_2016'、'MAX_2016')
[xml]$xaml=@”
"@
$reader=(新对象System.Xml.XmlNodeReader$xaml)
$window=[Windows.Markup.XamlReader]::加载($reader)
$data=@()
foreach($套目标){
$data+=新对象PSObject-prop@{Name=“$target”;Category=“Sets”}
}
foreach($包中的目标){
$data+=新对象PSObject-prop@{Name=“$target”;Category=“Packages”}
}
$listView=[System.Windows.Data.ListCollectionView]$Data
$listView.GroupDescriptions.Add((新对象System.Windows.Data.PropertyGroupDescription“类别”))
$location=$window.findname(“位置”)
$location.ItemsSource=$locations
$target=$window.findname(“目标”)
$target.ItemsSource=$listView
$window.ShowDialog()| out null

根据您在问题中链接的第一个示例,下面是PowerShell中的一个简单实现

添加类型–assemblyName WindowsBase
添加类型–assemblyName PresentationCore
添加类型–assemblyName PresentationFramework
[xml]$xaml=@”
"@
$reader=(新对象Xml.XmlNodeReader$xaml)
$GUIWindow=[Windows.Markup.XamlReader]::加载($reader)
$xaml.SelectNodes(“/*[@Name]”)|%{Set Variable-Name($\.Name)-Value$GUIWindow.FindName($\.Name)}
$data=@()
$data+=新对象PSObject-prop@{Name=“Arch”;Category=“Sets”}
$data+=新对象PSObject-prop@{Name=“MEP”;Category=“Sets”}
$data+=新对象PSObject-prop@{Name=“Viz”;Category=“Sets”}
$data+=新对象PSObject-prop@{Name=“RVT_2015”;Category=“Packages”}
$data+=新对象PSObject-prop@{Name=“RVT_2016”;Category=“Packages”}
$data+=新对象PSObject-prop@{Name=“MAX_2016”;Category=“Packages”}
$lview=[System.Windows.Data.ListCollectionView]$Data
$lview.GroupDescriptions.Add((新对象System.Windows.Data.PropertyGroupDescription“类别”))
$comboBox.ItemsSource=$lview
$GUIWindow.ShowDialog()| out null
这是非常基本的,但您可以在此基础上继续

编辑:

最初的答案是使用以下两行:

$lview = [System.Windows.Data.ListCollectionView]::new($data)
$lview.GroupDescriptions.Add([System.Windows.Data.PropertyGroupDescription]::new("Category"))
它们在PS5中工作,但在所有早期版本的PowerShell中都会产生错误。解决方法是对ListCollectionView使用类型转换。这在PS2中起作用

$lview = [System.Windows.Data.ListCollectionView]$data
$lview.GroupDescriptions.Add((new-object System.Windows.Data.PropertyGroupDescription "Category"))

我已经用这个变通方法编辑了代码

简,这正是我需要的开始!谢谢一个澄清,我只是暂时的PS v2。我没有能力强迫我的客户升级,我所在行业的大多数人都紧紧抓住Windows7不放,就像一只树懒宝宝紧紧抓住它的妈妈一样。我询问v2,因为我获取方法调用失败,因为[System.Windows.Data.ListCollectionView]不包含名为“new”的方法。在两行$lview上,我想我可能需要.NET 4.5来完成这个,对吗?嗯,似乎这不是一个.NET版本的问题,正如我尝试([System.Windows.Data.ListCollectionView])|在安装了.NET 4.5的机器上获取成员,我得到了相同的错误。看起来我早上还有更多的谷歌搜索要做。@gordon是的,我可以在PS4和.NET4.5之前的任何东西上重现这个错误。奇怪,因为我找不到任何与WPF相关的PowerShell更改的引用。无论如何,我已经用一个变通方法编辑了答案。简,非常感谢。这使我取得了很大的进步。最后一点澄清。基于上面修改的代码,我现在有两个组合框,一个分组,一个不分组。未分组的一个以不确定状态开始,而分组的一个以选择的第一个项目开始,但是我在XML中没有看到任何定义这两个项目的开始条件的内容。我猜使用GroupStyle会改变默认行为,我需要搜索允许使用GroupStyle进行不确定默认的XML?“还是我因为这个假设而变得麻木了?”戈登很高兴它奏效了。至于自动选择第一项的分组组合框,我认为这是由集合视图引起的。不知道如何防止这种情况发生,但您可以在显示表单之前使用
$target.SelectedItem=$null
取消选中它。