Visual Studio/WPF > 기본 보기에서 ListView의 정렬을 실현합니다.

운영 환경
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2

h tp : /// s ぇ l. ldb㎉g. jp / archi s / 52307556. HTML
를 바탕으로 학습 중.

나열된 코드는 _bookList의 선언이 없으므로 오류가 발생합니다.

옳은지 불분명하지만, private ObservableCollection<Book> _bookList; 와 같이 선언해 보았다.

코드를 간결하게 하기 위해, 삼각의 표시는 넣고 있지 않다.

MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace _170605_t1450_collectionViewSource
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            _bookList = (this.DataContext as BooksData).BookList;
            _viewSource = CollectionViewSource.GetDefaultView(_bookList);
        }

        private GridViewColumnHeader _lastHeaderClicked = null;
        private ListSortDirection _lastDirection = ListSortDirection.Ascending;
        private ICollectionView _viewSource;
        private ObservableCollection<Book> _bookList; // 追加

        private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
        {
            GridViewColumnHeader clickedHeader = e.OriginalSource as GridViewColumnHeader;
            if (clickedHeader == null)
            {
                return;
            }
            if (clickedHeader.Role != GridViewColumnHeaderRole.Padding)
            {
                ListSortDirection direction = ListSortDirection.Ascending;
                if (clickedHeader == _lastHeaderClicked &&
                    _lastDirection == ListSortDirection.Ascending)
                {
                    direction = ListSortDirection.Descending;
                }
                string header = (clickedHeader.Column.DisplayMemberBinding as Binding).Path.Path;

                Sort(header, direction);
                _lastHeaderClicked = clickedHeader;
                _lastDirection = direction;
            }
        }

        private void Sort(string sortBy, ListSortDirection direciton)
        {
            SortDescription sd = new SortDescription(sortBy, direciton);
            _viewSource.SortDescriptions.Clear();
            _viewSource.SortDescriptions.Add(sd);
            _viewSource.Refresh();
        }
    }

    public class Book
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public double Price { get; set; }
        public DateTime Date { get; set; }
    }

    public class BooksData
    {
        public BooksData()
        {
            BookList = new ObservableCollection<Book>();
            BookList.Add(new Book
            {
                Title = "リファクタリング",
                Author = "Martin Fowler",
                Date = new DateTime(2000, 5, 1),
                Price = 5040,
            });
            BookList.Add(new Book
            {
                Title = "アジャイルプラクティス",
                Author = "Venkat Subramaniam",
                Date = new DateTime(2007, 12, 22),
                Price = 2520,
            });
            BookList.Add(new Book
            {
                Title = "詳細 正規表現",
                Author = "Jeffrey Friedl",
                Date = new DateTime(2008, 4, 26),
                Price = 5040,
            });
        }
        public ObservableCollection<Book> BookList { get; set; }
    }
}

MainWindow.xaml
<Window x:Class="_170605_t1450_collectionViewSource.MainWindow"
        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:_170605_t1450_collectionViewSource"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="720">
    <Window.DataContext>
        <local:BooksData />
    </Window.DataContext>
    <Grid>
        <ListView Name="listView1" Margin="12"
                  ItemsSource="{Binding Path=BookList}"
                  GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
                  >
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Title}" Header="書籍名"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Author}" Header="著者"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Date, StringFormat=yyyy年MM月}" Header="出版月"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Price,StringFormat='#,###円'}" Header="価格"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>



GridHeader 클릭으로 정렬을 변경할 수 있습니다.

(잘못되었을지도 모른다).

좋은 웹페이지 즐겨찾기