Visual Studio/WPF > (clickedHeader.Column.DisplayMemberBinding as Binding).Path.Path

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

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

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();
            _viewSource = listView1.ItemsSource as ICollectionView;
        }

        private GridViewColumnHeader _lastHeaderClicked = null;
        private ListSortDirection _lastDirection = ListSortDirection.Ascending;
        private ICollectionView _viewSource;

        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.Resources>
        <local:BooksData x:Key="books"/>
        <CollectionViewSource x:Key="myView" Source="{Binding Source={StaticResource books}, Path=BookList}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Date"/>
                <scm:SortDescription PropertyName="Price"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <Grid>
        <ListView Name="listView1" Margin="12"
                  ItemsSource="{Binding Source={StaticResource myView}}"
                  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>

신경이 쓰이는 부분



이하가 신경이 쓰인 부분.
string header = (clickedHeader.Column.DisplayMemberBinding as Binding).Path.Path;

이 이중의 ".Path"는 무엇이 될 것인가.

브레이크 포인트에서 멈추어 보았다.


(clickedHeader.Column.DisplayMemberBinding as Binding){System.Windows.Data.Binding} 가 된다.
(clickedHeader.Column.DisplayMemberBinding as Binding).Path{System.Windows.PropertyPath} 가 된다.
(clickedHeader.Column.DisplayMemberBinding as Binding).Path.Path 는 Author가 된다 (클릭 부분에 따라서 다르다).

어리석은 느낌이 넘치지 않는다.

좋은 웹페이지 즐겨찾기