Powershell、XAML、WPF-ListView分组不工作
我需要帮助来理解为什么在下面的示例中列表项没有分组 正在填充“属性”和“值”数据,但根本没有分组。我从在线示例中拼凑了这个脚本,但对XAML、数据绑定的工作原理等以及它在PowerShell上下文中的工作原理没有很好的理解。这是可行的,但我重构了代码,分组功能中断了,现在我一辈子都搞不清楚到底是什么原因 如果有人能帮助我,我将不胜感激 ModalWindow.xaml 结果模态对话框 编辑 澄清一下,这就是我想要实现的目标:Powershell、XAML、WPF-ListView分组不工作,wpf,powershell,xaml,Wpf,Powershell,Xaml,我需要帮助来理解为什么在下面的示例中列表项没有分组 正在填充“属性”和“值”数据,但根本没有分组。我从在线示例中拼凑了这个脚本,但对XAML、数据绑定的工作原理等以及它在PowerShell上下文中的工作原理没有很好的理解。这是可行的,但我重构了代码,分组功能中断了,现在我一辈子都搞不清楚到底是什么原因 如果有人能帮助我,我将不胜感激 ModalWindow.xaml 结果模态对话框 编辑 澄清一下,这就是我想要实现的目标: 请参阅:当我剪切并粘贴您的代码,并更正一些问题(只需在$NewAD
请参阅:当我剪切并粘贴您的代码,并更正一些问题(只需在$NewADUserParams中填充,例如=“boss”而不是“=boss”),这样它就可以在我的机器上运行,所有内容都是分组的——尽管它没有那么花哨。所有的将军都在一起,等等。我添加了一个列来显示分组,这样更容易看到 如果你不加评论的话 $ListViewItemsSource.GroupDescriptions.Add((新对象System.Windows.Data.PropertyGroupDescription“分组”)) 您应该按照添加数据的顺序查看数据,而不是将数据分组在一起
Function GetListViewItemsSource() {
Param ($NewADUserParams)
$Data = @()
$Groupings = @{
DEFAULT = "Other";
GENERAL = "General";
ACCOUNT = "Account";
ORGANIZATION = "Organization";
}
$IgnoredKeys = @("PassThru", "Enabled")
$GroupingsMap = @{
Description = $Groupings.GENERAL;
UserPrincipalName = $Groupings.ACCOUNT;
DisplayName = $Groupings.GENERAL;
SamAccountName = $Groupings.ACCOUNT;
AccountExpirationDate = $Groupings.ACCOUNT;
Name = $Groupings.GENERAL;
Company = $Groupings.ORGANIZATION;
}
ForEach ($Key in $NewADUserParams.Keys) {
If ($IgnoredKeys -contains $Key) { Continue; }
$Grouping = $Groupings.DEFAULT
If ($GroupingsMap.ContainsKey($Key)) {
$Grouping = $GroupingsMap[$Key]
}
$Data += New-Object PSObject -prop @{Property = $Key; Value = $NewADUserParams[$Key]; Grouping = $Grouping; }
}
$ListViewItemsSource = [System.Windows.Data.ListCollectionView] $Data
$ListViewItemsSource.GroupDescriptions.Add((New-Object System.Windows.Data.PropertyGroupDescription "Grouping"))
Return $ListViewItemsSource
}
Function ShowModalWindow() {
Param ($ListViewItemsSource)
[XML] $ModalWindowXAML = Get-Content -Path C:\Users\mspow\OneDrive\Documents\ModalWindow.xml
$NodeReader = (New-Object System.Xml.XmlNodeReader $ModalWindowXAML)
$ModalWindow = [Windows.Markup.XamlReader]::Load( $NodeReader )
$ListView = $ModalWindow.FindName("DataListView")
$ListView.ItemsSource = $ListViewItemsSource
$ConfirmButton = $ModalWindow.FindName("ConfirmButton")
$CancelButton = $ModalWindow.FindName("CancelButton")
$Response = @{
Value = 0
}
$ConfirmButton.Add_Click( {
$Response.Value = 1
$ModalWindow.Close()
})
$CancelButton.Add_Click( {
$ModalWindow.Close()
})
$ModalWindow.ShowDialog()
Return $Response
}
$NewADUserParams = @{
# ...
Description = "bar, foo";
DisplayName = "bar, foo";
SamAccountName = "foo.bar";
AccountExpirationDate = "12/31/9999 00:00:00";
Name = "foo.bar";
GivenName = "foo";
Title = 'boss';
OtherAttributes = 'System.Collections.Hashtable';
Surname = "bar";
ChangePasswordAtLogon = $true;
# etc...
}
$ListViewItemsSource = GetListViewItemsSource -NewADUserParams $NewADUserParams
$ConfirmUserProps = ShowModalWindow -ListViewItemsSource $ListViewItemsSource
不应对项目资源
集合进行分组。它应该是“平的”。@mm8您能详细说明一下吗,或者举个简单的例子?我编辑了这篇文章,试图澄清我想要实现的目标。谢谢,谢谢,马克。我真的希望得到的布局就像我在OP中发布的图片一样。我知道这是可能的,因为我确实让它工作了,但我只需要找出我在XAML布局代码中的错误。
Function GetListViewItemsSource() {
Param ($NewADUserParams)
$Data = @()
$Groupings = @{
DEFAULT = "Other";
GENERAL = "General";
ACCOUNT = "Account";
ORGANIZATION = "Organization";
}
$IgnoredKeys = @("PassThru", "Enabled")
$GroupingsMap = @{
Description = $Groupings.GENERAL;
UserPrincipalName = $Groupings.ACCOUNT;
DisplayName = $Groupings.GENERAL;
SamAccountName = $Groupings.ACCOUNT;
AccountExpirationDate = $Groupings.ACCOUNT;
Name = $Groupings.GENERAL;
Company = $Groupings.ORGANIZATION;
}
ForEach ($Key in $NewADUserParams.Keys) {
If ($IgnoredKeys -contains $Key) { Continue; }
$Grouping = $Groupings.DEFAULT
If ($GroupingsMap.ContainsKey($Key)) {
$Grouping = $GroupingsMap[$Key]
}
$Data += New-Object PSObject -prop @{Property = $Key; Value = $NewADUserParams[$Key]; Grouping = $Grouping; }
}
$ListViewItemsSource = [System.Windows.Data.ListCollectionView] $Data
$ListViewItemsSource.GroupDescriptions.Add((New-Object System.Windows.Data.PropertyGroupDescription "Grouping"))
Return $ListViewItemsSource
}
Function ShowModalWindow() {
Param ($ListViewItemsSource)
[XML] $ModalWindowXAML = Get-Content -Path $Config.XAML.ModalWindow
$NodeReader = (New-Object System.Xml.XmlNodeReader $ModalWindowXAML)
$ModalWindow = [Windows.Markup.XamlReader]::Load( $NodeReader )
$ListView = $ModalWindow.FindName("DataListView")
$ListView.ItemsSource = $ListViewItemsSource
$ConfirmButton = $ModalWindow.FindName("ConfirmButton")
$CancelButton = $ModalWindow.FindName("CancelButton")
$Response = @{
Value = 0
}
$ConfirmButton.Add_Click( {
$Response.Value = 1
$ModalWindow.Close()
})
$CancelButton.Add_Click( {
$ModalWindow.Close()
})
$ModalWindow.ShowDialog()
Return $Response
}
$NewADUserParams = @{
# ...
Description = "bar, foo";
DisplayName = "bar, foo";
SamAccountName = "foo.bar";
AccountExpirationDate = "12/31/9999 00:00:00";
Name = "foo.bar";
GivenName = "foo";
Title = boss;
OtherAttributes = System.Collections.Hashtable;
Surname = "bar";
ChangePasswordAtLogon = True;
# etc...
}
$ListViewItemsSource = GetListViewItemsSource -NewADUserParams $NewADUserParams
$ConfirmUserProps = ShowModalWindow -ListViewItemsSource $ListViewItemsSource
Function GetListViewItemsSource() {
Param ($NewADUserParams)
$Data = @()
$Groupings = @{
DEFAULT = "Other";
GENERAL = "General";
ACCOUNT = "Account";
ORGANIZATION = "Organization";
}
$IgnoredKeys = @("PassThru", "Enabled")
$GroupingsMap = @{
Description = $Groupings.GENERAL;
UserPrincipalName = $Groupings.ACCOUNT;
DisplayName = $Groupings.GENERAL;
SamAccountName = $Groupings.ACCOUNT;
AccountExpirationDate = $Groupings.ACCOUNT;
Name = $Groupings.GENERAL;
Company = $Groupings.ORGANIZATION;
}
ForEach ($Key in $NewADUserParams.Keys) {
If ($IgnoredKeys -contains $Key) { Continue; }
$Grouping = $Groupings.DEFAULT
If ($GroupingsMap.ContainsKey($Key)) {
$Grouping = $GroupingsMap[$Key]
}
$Data += New-Object PSObject -prop @{Property = $Key; Value = $NewADUserParams[$Key]; Grouping = $Grouping; }
}
$ListViewItemsSource = [System.Windows.Data.ListCollectionView] $Data
$ListViewItemsSource.GroupDescriptions.Add((New-Object System.Windows.Data.PropertyGroupDescription "Grouping"))
Return $ListViewItemsSource
}
Function ShowModalWindow() {
Param ($ListViewItemsSource)
[XML] $ModalWindowXAML = Get-Content -Path C:\Users\mspow\OneDrive\Documents\ModalWindow.xml
$NodeReader = (New-Object System.Xml.XmlNodeReader $ModalWindowXAML)
$ModalWindow = [Windows.Markup.XamlReader]::Load( $NodeReader )
$ListView = $ModalWindow.FindName("DataListView")
$ListView.ItemsSource = $ListViewItemsSource
$ConfirmButton = $ModalWindow.FindName("ConfirmButton")
$CancelButton = $ModalWindow.FindName("CancelButton")
$Response = @{
Value = 0
}
$ConfirmButton.Add_Click( {
$Response.Value = 1
$ModalWindow.Close()
})
$CancelButton.Add_Click( {
$ModalWindow.Close()
})
$ModalWindow.ShowDialog()
Return $Response
}
$NewADUserParams = @{
# ...
Description = "bar, foo";
DisplayName = "bar, foo";
SamAccountName = "foo.bar";
AccountExpirationDate = "12/31/9999 00:00:00";
Name = "foo.bar";
GivenName = "foo";
Title = 'boss';
OtherAttributes = 'System.Collections.Hashtable';
Surname = "bar";
ChangePasswordAtLogon = $true;
# etc...
}
$ListViewItemsSource = GetListViewItemsSource -NewADUserParams $NewADUserParams
$ConfirmUserProps = ShowModalWindow -ListViewItemsSource $ListViewItemsSource
<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:WpfApp2"
Title="Confirm User Details" Height="580" Width="360" >
<Grid Margin="10">
<ListView Name="DataListView" Margin="0" VerticalAlignment="Top" Height="475">
<ListView.Resources>
<Style TargetType="GridViewColumnHeader">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Width="196" DisplayMemberBinding="{Binding Grouping}" />
<GridViewColumn Width="110" DisplayMemberBinding="{Binding Property}" />
<GridViewColumn Width="196" DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Margin="5" TextDecorations="Underline" FontSize="13" Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
<Button Name="ConfirmButton" Content="OK" Height="39" Width="160" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
<Button Name="CancelButton" Content="Cancel" Margin="0" Width="160" Height="39" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
</Grid>
</Window>