2012/02/03

プロパティ名でソート

バインディングで指定したパスを使ってソートキーを指定したかった。

ListView のカラムをクリックしたときのイベントは ListView.GridViewColumnHeader.Click らしい。

private void listView_Click(object sender, RoutedEventArgs e)
{
    var header = e.OriginalSource as GridViewColumnHeader;
    var binding = header.Column.DisplayMemberBinding as Binding;

    if (currentOrder == SortingOrder.Ascending)
    {
        currentOrder = SortingOrder.Descending;
    }
    else
    {
        currentOrder = SortingOrder.Ascending;
    }

    SortByProperty(binding.Path.Path, currentOrder);
}

コードビハインドに直書きしてるけど、MVVM スタイルでやりたいならビューモデルに binding.Path.Path を送信すればよさそう。

ソート部分はリフレクションを使って、

private void SortByProperty(string name, SortingOrder order)
{
    var sorted = Players.OrderBy(x => x.GetType().GetProperty(name).GetValue(x, null)).ToList();

    if (order == SortingOrder.Descending)
    {
        sorted.Reverse();
    }

    listView.ItemsSource = sorted;
}

みたいな感じでうまくいった。

ListView にある本来のソート機能を使うべきなんだろうけど、魔改造(TreeListView とか)してあると中途半端にソートされて上手くいかないので、データソースを直接ソートするしかないという。

0 件のコメント:

コメントを投稿