< <elem xmlns=''> は指定できません。 | 文字列リテラルを複数行で記述する >

January 8, 2009

添付プロパティにしちゃえばいいんじゃない ?

ListView のソート実装の件。詳細はまた書きます。

public class GridViewSortHelper
{
    protected ListView  listView;
    protected GridViewColumnHeader lastSortedHeader;
    protected ListSortDirection lastSortDirection = ListSortDirection.Ascending;

    /// <summary>
    /// <c>GridViewSortHelper.SortKey</c> 添付プロパティ
    /// </summary>
    /// <value>ソートに使用するキー文字列</value>
    public static readonly DependencyProperty SortKeyProperty =
        DependencyProperty.RegisterAttached ("SortKey", typeof (string), typeof (GridViewSortHelper), new FrameworkPropertyMetadata (""));

    /// <summary>
    /// 要素に <c>GridViewSortHelper.SortKey</c> 添付プロパティを設定します。
    /// </summary>
    /// <param name="element">プロパティ値の書き込み対象の要素。</param>
    /// <param name="value">要素の <c>GridViewSortHelper.SortKey</c> 属性値</param>
    public static void SetSortKey (GridViewColumn element, string value)
    {
        element.SetValue (SortKeyProperty, value);
    }

    /// <summary>
    /// 要素の <c>GridViewSortHelper.SortKey</c> 添付プロパティを取得します
    /// </summary>
    /// <param name="element"> プロパティ値の読み取り元の要素。</param>
    /// <returns>要素の <c>GridViewSortHelper.SortKey</c> 属性値</returns>
    public static string GetSortKey (GridViewColumn element)
    {
        return (string) element.GetValue (SortKeyProperty);
    }

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="listView">ソート対象の ListView</param>
    public GridViewSortHelper (ListView listView)
    {
        this.listView = listView;
    }

    /// <summary>
    /// ヘッダクリック時処理
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void OnHeaderClicked (object sender, RoutedEventArgs e)
    {
        var headerClicked = e.OriginalSource as GridViewColumnHeader;
        if (headerClicked != null)
        {
            var direction = ListSortDirection.Ascending;
            if (headerClicked == lastSortedHeader)
            {
                if (lastSortDirection == ListSortDirection.Ascending)
                {
                    direction = ListSortDirection.Descending;
                }
            }
            var key = GetSortKey (headerClicked.Column);

            var dataView = CollectionViewSource.GetDefaultView (this.listView.ItemsSource);
            dataView.SortDescriptions.Clear ();
            var sortDescription = new SortDescription (key, direction);
            dataView.SortDescriptions.Add (sortDescription);
            dataView.Refresh ();

            lastSortedHeader = headerClicked;
            lastSortDirection = direction;
        }

    }
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2287

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?