深入探討WPF的ListView控件


     接上一篇博客初步探討WPF的ListView控件(涉及模板、查找子控件)  我們繼續探討ListView的用法

     一、實現排序功能

     需求是這樣的:假如我們把學生的分數放入ListView,當我們單機ListView頭部時候實現對按分數的排序,更改Xaml如下:

<Window x:Class="ContentDataTemplate.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" xmlns:local="clr-namespace:ContentDataTemplate" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <c:ArrayList x:Key="stuList">
            <local:Student Id="1" Name="小明" Grade="研一" Professional="計算機技術" Score="30" HasJob="true"></local:Student>
            <local:Student Id="2" Name="小李" Grade="大一" Professional="網絡工程" Score="80" HasJob="true"></local:Student>
            <local:Student Id="3" Name="小張" Grade="研一" Professional="軟件工程" Score="100" HasJob="False"></local:Student>
            <local:Student Id="4" Name="小王" Grade="研一" Professional="自動化控制" Score="70" HasJob="true"></local:Student>
            <local:Student Id="5" Name="大王" Grade="研一" Professional="軟件設計" Score="60" HasJob="False"></local:Student>
        </c:ArrayList>
        <DataTemplate x:Key="NameDt">
            <TextBox x:Name="textboxName" Text="{Binding Name}" GotFocus="textboxName_GotFocus"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="GradeDt">
            <TextBox x:Name="textboxGrade" Text="{Binding Grade}"></TextBox>            
        </DataTemplate>
        <DataTemplate x:Key="ProfessionalDt">
            <TextBox x:Name="textboxProfessional" Text="{Binding Professional}"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="ScoreDt">
            <TextBox Name="textboxScore" Text="{Binding Score}"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="HasJobDt">
            <CheckBox x:Name="CheckBocHasJob" IsChecked="{Binding HasJob}" Checked="CheckBocHasJob_Checked"></CheckBox>            
        </DataTemplate>
        
    </Window.Resources>
    <Grid Margin="5">
        <ListView x:Name="ListViewStudent" ItemsSource="{StaticResource stuList}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"></GridViewColumn>
                    <GridViewColumn Header="姓名" CellTemplate="{StaticResource NameDt}"></GridViewColumn>
                    <GridViewColumn Header="年級" CellTemplate="{StaticResource GradeDt}"></GridViewColumn>
                    <GridViewColumn Header="專業" CellTemplate="{StaticResource ProfessionalDt}"></GridViewColumn>
                    <GridViewColumn Header="分數" CellTemplate="{StaticResource ScoreDt}"></GridViewColumn>
                    <GridViewColumn Header="已工作" CellTemplate="{StaticResource HasJobDt}"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>
View Code

 更改地方也不多,Student類添加Score屬性,DataTemplate中增加Score的列模板,數據源添加一些默認的分數。

     數據有了,下面就是排序功能了,首先寫一個排序的函數:StuSort(string sortBy, ListSortDirection direction);排序功能的實現是通過CollectionViewSource類實現的,這個類我就不介紹了,可以對數據源進行排序分組什么的,詳情參考MSDN 。代碼如下:

  private void StuSort(ListView lv, string sortBy, ListSortDirection direction) { ICollectionView dataView =CollectionViewSource.GetDefaultView(lv.ItemsSource);//獲取數據源視圖
            dataView.SortDescriptions.Clear();//清空默認排序描述
            SortDescription sd = new SortDescription(sortBy, direction); dataView.SortDescriptions.Add(sd);//加入新的排序描述
            dataView.Refresh();//刷新視圖
        }

      函數寫好了,介紹下此函數的三個參數,第一個毫無疑問是數據的承載着ListView了,第二個比較重要是要通過那個字段排序,本例子是通過Student的Score來排序,所以就是“Score”,第三個參數是排序方向,升序或者降序了。然后當我們點擊ListView的Header的時候觸發此函數。Xaml頁面中的ListView中監控GridViewColumnHeaderClick的路由事件,

 <ListView x:Name="ListViewStudent"
                  ItemsSource="{StaticResource stuList}"
                   GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
                  >

后台實現GridViewColumnHeaderClickedHandler事件,代碼如下:

    private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e) { GridViewColumnHeader gch=e.OriginalSource as GridViewColumnHeader; StuSort(this.ListViewStudent, "Score", ListSortDirection.Ascending); }

運行,單機分數,實現排序功能。

 二、具有強大視圖功能ListView

       ListView可以提供不同的視圖功能切換,但是默認提供了僅僅是GridView,那我們是不是可以自定義自己的View呢,答案是肯定的。我就不再細說因為微軟的示例已經很好了,http://msdn.microsoft.com/zh-cn/library/vstudio/ms771469(v=vs.90).aspx 。講的很詳細,一共提供了四種自定義視圖。

 

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM