Powershell, XAML, WPF - группировки ListView не работают - PullRequest
0 голосов
/ 28 октября 2019

Мне нужна помощь, чтобы понять, почему элементы списка не группируются в приведенном ниже примере.

Данные 'Свойство' и 'Значение' заполняются, но группировка вообще отсутствует. Я собрал воедино этот сценарий из онлайн-примеров, не разбираясь в XAML, в том, как работает привязка данных и т. Д. И как он должен работать в контексте PowerShell. Он работал , но я реорганизовал код, и функциональность группировки не работала, и теперь я не могу понять, почему.

Если кто-нибудь может мне помочь, это будет очень признательно.

ModalWindow.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: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="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>

Main.ps1

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

Результирующий модальныйДиалог

Output

Редактировать

Чтобы уточнить, я пытаюсь достичь этого:

enter image description here

См .: https://www.wpf -tutorial.com / listview-control / listview-grouping /

1 Ответ

0 голосов
/ 29 октября 2019

Когда я вырезаю и вставляю ваш код и исправляю несколько проблем (просто добавьте $ NewADUserParams вроде = "boss" вместо = boss), чтобы он работал на моей машине, все сгруппировано, хотя это не так уж и сложно,Все генералы вместе и т. Д. Я добавил столбец, показывающий группировку, чтобы было легче увидеть.

Если вы закомментируете $ ListViewItemsSource.GroupDescription.Add ((New-Object System.Windows.Data.PropertyGroupDescription "Grouping"))

, вы должны увидеть данные в порядке их добавления, а не сгруппированы вместе.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...