Powershell、XAML、WPF-ListView分组不工作

Powershell、XAML、WPF-ListView分组不工作,wpf,powershell,xaml,Wpf,Powershell,Xaml,我需要帮助来理解为什么在下面的示例中列表项没有分组 正在填充“属性”和“值”数据,但根本没有分组。我从在线示例中拼凑了这个脚本,但对XAML、数据绑定的工作原理等以及它在PowerShell上下文中的工作原理没有很好的理解。这是可行的,但我重构了代码,分组功能中断了,现在我一辈子都搞不清楚到底是什么原因 如果有人能帮助我,我将不胜感激 ModalWindow.xaml 结果模态对话框 编辑 澄清一下,这就是我想要实现的目标: 请参阅:当我剪切并粘贴您的代码,并更正一些问题(只需在$NewAD

我需要帮助来理解为什么在下面的示例中列表项没有分组

正在填充“属性”和“值”数据,但根本没有分组。我从在线示例中拼凑了这个脚本,但对XAML、数据绑定的工作原理等以及它在PowerShell上下文中的工作原理没有很好的理解。这是可行的,但我重构了代码,分组功能中断了,现在我一辈子都搞不清楚到底是什么原因

如果有人能帮助我,我将不胜感激

ModalWindow.xaml 结果模态对话框

编辑 澄清一下,这就是我想要实现的目标:


请参阅:

当我剪切并粘贴您的代码,并更正一些问题(只需在$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>