如何通过单击此GridView中的列标题来添加排序?

时间:2011-04-29 08:54:59

标签: wpf sorting gridview powershell wpk

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {
        New-ListView -Name ListView -View {
           New-GridView -AllowsColumnReorder -Columns {
               New-GridViewColumn "title" 
           }
    } -show -On_Loaded {
            $ff_sql = @"
SELECT 'abc' title
union
SELECT 'xyz' title
union
SELECT 'efg' title
"@
            $TableView = $window | Get-ChildControl ListView
            $TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)
             } 
}

Show-Bockmarks $conn

编辑: 我将代码转换为XAML

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {

[xml] $xaml = @"
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="MainWindow" >
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
      Name="Listview">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="title"
                                DisplayMemberBinding="{Binding title}" 
                                />
                <GridViewColumn Header="itemid"
                                DisplayMemberBinding="{Binding itemid}" 
                                />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )

$ff_sql = @"
SELECT 'abc' title, 3 itemid
union
SELECT 'xyz' title, 2 itemid
union
SELECT 'efg' title, 1 itemid
"@

$TableView = $Form.FindName("Listview")
$TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)

$Form.ShowDialog() #| out-null
}

Show-Bockmarks $conn

但是当我添加Thomas Levesque提出的线条时

ipmo WPK

$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString 
$conn.Open() 

function Invoke-sql1
{
    param( [string]$sql,
           [System.Data.SQLClient.SQLConnection]$connection
           )
    $cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
    $da.fill($ds) | Out-Null
    return $ds.tables[0]
}

function Show-Bockmarks ($conn) {

[xml] $xaml = @"
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:util="clr-namespace:TheNameSpace;assembly=TheAssembly"
  Title="MainWindow" >
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
       util:GridViewSort.AutoSort="True"
      Name="Listview">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="title"
                                DisplayMemberBinding="{Binding title}"
                                util:GridViewSort.PropertyName="title" 
                                />
                <GridViewColumn Header="itemid"
                                DisplayMemberBinding="{Binding itemid}" 
                                util:GridViewSort.PropertyName="itemid" 
                                />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )

$ff_sql = @"
SELECT 'abc' title, 3 itemid
union
SELECT 'xyz' title, 2 itemid
union
SELECT 'efg' title, 1 itemid
"@

$TableView = $Form.FindName("Listview")
$TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)

$Form.ShowDialog() #| out-null
}

Show-Bockmarks $conn

我收到错误

Exception calling "Load" with "1" argument(s): "The property 'GridViewSort.AutoSort' does not exist in XML namespace 'clr-namespace:TheNameSpace;assembly=TheAssembly'. Line '0' 
Position '0'."

我想我必须注册一些程序集。

1 个答案:

答案 0 :(得分:2)

有关XAML解决方案,请参阅this blog post(和this one

您还可以使用GridViewSort.SetAutoSortGridViewSort.SetPropertyName方法在代码中使用此解决方案。我不知道Powershell语法,但这里是C#:

GridViewSort.SetAutoSort(TableView, true);
GridViewSort.SetPropertyName(TitleColumn, "title");