如何通过单击标题对带有ObservableCollection的ListView进行排序 [英] How to sort ListView With ObservableCollection by Clicking Header

查看:109
本文介绍了如何通过单击标题对带有ObservableCollection的ListView进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是WPF的初学者.我正在尝试通过单击列来对listview进行排序(asc/desc).我已将一个可观察的集合绑定到我的列表视图.我尝试了一些在这里找到的内容 https://msdn.microsoft.com/en-us/library/ms745786(v=vs.110).aspx 由于某种原因,它对我不起作用.在此链接中,我的代码几乎相同.但是我还是在这里写了它,尽管很抱歉它有点长.

I am beginner at WPF. I am trying to sort (asc/desc) a listview by clicking a column. I have binded an observable collection to my listview. I have tried something I have found here https://msdn.microsoft.com/en-us/library/ms745786(v=vs.110).aspx For some reason it doesn't work on me. My code is almost same within this link here. But I wrote it here anyways though sorry that it's a little bit long.

我进行了一些搜索,许多答案已经完全表明了我的所作所为.所以我想我在某个地方犯了一些错误.

I made some search and many answer already suggests exactly what I did. So I guess I made some mistakes somewhere.

这是WPF:

    <ListView Grid.Row="3" Name="lvPurchaseSummaryList" ItemsSource="{Binding purchaseSummaryCol, Mode=Default}" Width="1700" HorizontalAlignment="Left" GridViewColumnHeader.Click="purchaseSummaryListColumn_click">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Path=originalName}" Header="Original Name" />
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Path=turkishName}" Header="Local Name"/>
 // List goes on like this...
            </GridView>
        </ListView.View>
</ListView>

这是类(与msdn链接几乎相同):

Here is the class (almost same with msdn link):

public partial class PurchaseSummaryPage : Page
{
    GridViewColumnHeader _lastHeaderClicked = null;
    ListSortDirection _lastDirection = ListSortDirection.Ascending;
    public PurchaseSummaryPage()
    {
        InitializeComponent();  
    }

    void purchaseSummaryListColumn_click(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(lvPurchaseSummaryList.ItemsSource);

        dataView.SortDescriptions.Clear();
        SortDescription sd = new SortDescription(sortBy, direction);

        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();
    }
}

这是从主窗口进入的,里面有一些示例...

And this is from main window with some example in it...

    public ObservableCollection<PurchaseSummary> purchaseSummaryCol { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        purchaseSummaryCol = new ObservableCollection<PurchaseSummary>();
        purchaseSummaryCol.Add(new PurchaseSummary("100", "basd", "asd", "basd", "asd", "basd", "asd", "basd", "asd", new Pay(DateTime.Today, DateTime.Today, 3), new PayRestrict(), new Vod()));
        purchaseSummaryCol.Add(new PurchaseSummary("105", "asd", "basd", "asd", "basd", "asd", "basd", "asd", "basd", new Pay(DateTime.Today, DateTime.Today, 3), new PayRestrict(), new Vod()));
        purchaseSummaryCol.Add(new PurchaseSummary("101", "casd", "cbasd", "casd", "cbasd", "casd", "cbasd", "casd", "cbasd", new Pay(DateTime.Today, DateTime.Today, 3), new PayRestrict(), new Vod()));

        PurchaseSummaryPage purchaseSummaryPage = new PurchaseSummaryPage();
        purchaseSummaryPage.DataContext = this;
        AttachPageToFrame(_f, purchaseSummaryPage);
    }

推荐答案

原因来自此代码:

string header = headerClicked.Column.Header as string;
            Sort(header, direction);

它使用标题文本,在您的情况下该标题文本与属性名称不同,简单的解决方法是尝试将标题设置为与属性名称Header="originalName"

which it uses header text which in your case it's not the same with Property Name, simple way to fix is try set Header as the same with Property Name Header="originalName"

为获得更好的解决方案,您可以将需要排序的propertyName存储在Header的Tag中,但我们需要执行以下操作:

For better solution, you can store the propertyName need to sort in Tag of Header, but we need to do more like this:

 <GridViewColumn Width="100"  DisplayMemberBinding="{Binding Path=originalName}"  >
                    <GridViewColumn.Header>
                        <TextBlock Text="Original Name" Tag="originalName"/>
                    </GridViewColumn.Header>
                </GridViewColumn>

然后输入代码:

 GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
        var tb = headerClicked.Column.Header as TextBlock;
        var propertyName = tb.Tag as string;
        Sort(propertyName, direction);

这篇关于如何通过单击标题对带有ObservableCollection的ListView进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆