Fork me on GitHub

ListView(三)

 

本例是在ListView中排序,它的原理很像在VS2003下实现DataGrid排序。

首先在XAML中画了两个三角形,一个正三角形“HeaderTemplateArrowUp”,另一个是倒三角形“HeaderTemplateArrowDown”,我后是一个叫“lv”的ListView。最后是一个ListView.ItemsSource数据资源。在每个DataTemplate中,定义了一个DockPanel,它中间有两部分,一部分是TextBlock,它绑定了ListView中的GridView中的原来Header。另一部分是Path,它是用来画一个三角形的。

XAML代码:

<Window     

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   

    xmlns:s="clr-namespace:System.Collections;assembly=mscorlib"

    xmlns:p="clr-namespace:System;assembly=mscorlib"

    x:Class="ListViewSort.Window1"   

    >

 <Window.Resources>

    <DataTemplate x:Key="HeaderTemplateArrowUp">

      <DockPanel>

        <TextBlock HorizontalAlignment="Center" Text="{Binding}"/>

        <Path x:Name="arrow"

           StrokeThickness = "1"                                  

           Fill            = "gray"

           Data            = "M 5,10 L 13,10 L 9,3 L 5,10"/>

     </DockPanel>

    </DataTemplate>

    <DataTemplate x:Key="HeaderTemplateArrowDown">

      <DockPanel>

        <TextBlock HorizontalAlignment="Center" Text="{Binding }"/>

        <Path x:Name="arrow"

              StrokeThickness = "1"                                    

              Fill            = "gray"

              Data            = "M 5,3 L 9,10 L 13,3 L 5,3"/>

      </DockPanel>

    </DataTemplate>

 </Window.Resources>

      

 <StackPanel>

    <TextBlock HorizontalAlignment="Center" FontSize="16"

      Foreground ="Blue" Margin="0,20,0,30">

      ListView Sample with Sort Capability

    </TextBlock>

    <ListView x:Name='lv' Height="244" HorizontalAlignment="Center"

      VerticalAlignment="Center"

      ButtonBase.Click="GridViewColumnHeaderClickedHandler"

     Width="382"

     >

      <ListView.View>

        <GridView>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Year}"

                          Header="Year"

                          Width="100"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Month}"

                          Header="Month"

                          Width="100"/>

          <GridViewColumn DisplayMemberBinding="{Binding Path=Day}"

                          Header="Day"

                          Width="100"/>

        </GridView>

      </ListView.View>

      <ListView.ItemsSource>

        <s:ArrayList>

          <p:DateTime>1993/1/1 12:22:02</p:DateTime>

          <p:DateTime>1993/1/2 13:2:01</p:DateTime>

          <p:DateTime>1997/1/3 2:1:6</p:DateTime>

          <p:DateTime>1997/1/4 13:6:55</p:DateTime>

          <p:DateTime>1999/2/1 12:22:02</p:DateTime>

          <p:DateTime>1998/2/2 13:2:01</p:DateTime>

          <p:DateTime>2000/2/3 2:1:6</p:DateTime>

          <p:DateTime>2002/2/4 13:6:55</p:DateTime>

          <p:DateTime>2001/3/1 12:22:02</p:DateTime>

          <p:DateTime>2006/3/2 13:2:01</p:DateTime>

          <p:DateTime>2004/3/3 2:1:6</p:DateTime>

          <p:DateTime>2004/3/4 13:6:55</p:DateTime>

        </s:ArrayList>

      </ListView.ItemsSource>

    </ListView>

 </StackPanel>

</Window>

下面代码主要实现当单击ListView的表头时实现排序,并且三角形也跟着变化。其中红色部分是实一排序的核心所在。headerClicked.Column.HeaderTemplate =                          Resources["HeaderTemplateArrowUp"] as DataTemplate;是按照顺序,来加载两个DataTemplate

 

CS代码:

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

using System.Collections;

using System.Windows.Controls.Primitives;

using System.ComponentModel;

using System.Windows.Data;

namespace ListViewSort

{

    /// <summary>

    /// Interaction logic for Window1.xaml

    /// </summary>

    public partial class Window1 : Window

    {

        public Window1()

        {

            InitializeComponent();

        }

 

        GridViewColumnHeader _lastHeaderClicked = null;

        ListSortDirection _lastDirection = ListSortDirection.Ascending;

 

        void GridViewColumnHeaderClickedHandler(object sender,

                                                RoutedEventArgs e)

        {

            GridViewColumnHeader headerClicked =

                  e.OriginalSource as GridViewColumnHeader;

            ListSortDirection direction;

 

            if (headerClicked != null)

            {

                if (headerClicked.Role != GridViewColumnHeaderRole.Padding)

                {

                    if (headerClicked != _lastHeaderClicked)

                    {

                        direction = ListSortDirection.Ascending;

                    }

                    else

                    {

                        if (_lastDirection == ListSortDirection.Ascending)

                        {

                            direction = ListSortDirection.Descending;

                        }

                        else

                        {

                            direction = ListSortDirection.Ascending;

                        }

                    }

 

                    string header = headerClicked.Column.Header as string;

                    Sort(header, direction);

 

                    if (direction == ListSortDirection.Ascending)

                    {

                        headerClicked.Column.HeaderTemplate =

                          Resources["HeaderTemplateArrowUp"] as DataTemplate;

                    }

                    else

                    {

                        headerClicked.Column.HeaderTemplate =

                          Resources["HeaderTemplateArrowDown"] as DataTemplate;

                    }

 

                    // Remove arrow from previously sorted header

                    if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)

                    {

                        _lastHeaderClicked.Column.HeaderTemplate = null;

                    }

 

                    _lastHeaderClicked = headerClicked;

                    _lastDirection = direction;

                }

            }

        }

        private void Sort(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();

        }     

    }

}

效果如下图:


本文参考MSDN组织。

posted @ 2007-04-10 23:30  桂素伟  阅读(1063)  评论(0编辑  收藏  举报