none
ListBoxで文字列をソートして表示するには? RRS feed

  • 質問

  • WPFビギナーです。

    ListBox のプロパティーにソートのTrue/Falseが見当たりませんが、どうすればいいのでしょうか。

    SortDescriptions とかデータバインディングとかがヒントですか。

    そんなに難しいものなのでしょうか。

    2008年8月3日 0:52

回答

  • コードからソートを設定するのは比較的簡単です。

     

    (参考)
    WPF ListBox sorting?
    http://forums.msdn.microsoft.com/en-US/wpf/thread/4b1c1813-068a-443c-91b6-71481c417e5b/

     

    XAML側からですとCollectionViewSource.SortDescriptionsを使います。

     

    (参考)
    Mark's Blog of Random Thoughts
    http://www.julmar.com/blog/mark/PermaLink,guid,5716861f-5560-40c7-b700-483e0cd80116.aspx

    2008年8月3日 3:13
    モデレータ
  •  

    WPF の ListBox は,文字列を繰り返し表示するものでなく,

    オブジェクトを繰り返し表示するものなので,

    実際に,繰り返すのは,

    オブジェクトのコレクションのビュー順になります。

     

    データ・テンプレートが設定されていない場合は,

    ToString() を呼び出して返ってきたものが表示されるので,

    一見,Windowsフォーム の ListBox と似たように見えますが,

    仕組みは,まったく別物で,

    一行で,複数項目を表示可能なので,

    どちらかといえば,

    Windowsフォームのコントロールの中だと,

    ListBox ではなく DataGridView に近いものです。

    また,

    DataGridView は,データセットのビューを設定することも可能だし,

    直接値をセットしていくことも可能ですよね。

    それと同じように,

    WPF の ListBox も コレクション・ビューをセットすることも可能だし,

    直接指定することも可能になっています。

     

    (コレクション・ビュー というのは,簡単に書くと,

    コレクションの実際の順番を変更しないまま,

    アクセス順だけ変更するような感じにしたものです。

    なので,ひとつのコレクション(インスタンス)から

    複数のコレクション・ビューを持つことも可能です。)

     

    リンク先だと,

    ListBox側から順番指定可能のように見えてるけど,

    直接値を入れて行った場合は,

    内部で自動的にラップする形になっているので,

    しくみ的には,

    オブジェクトのどのメンバで並び替えるのかを

    コレクションビュー側でやっぱり指定している感じになってます。

     

    リンク先のように単純なものは,

    Contentプロパティを利用して楽することも可能だったりする場合もあるけど,

    他の場合は確かに面倒な場合が多いけど,

    逆にちょっと凝ったことをやりたい場合は,

    いわゆるListBox と違って,かなり楽な筈です。

     

     

     

     

     

     

    2008年8月3日 4:11
  • こんにちは。中川俊輔 です。

     

    trapemiyaさん、yayadon さん、回答ありがとうございます。

     

    Yo48さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、

    trapemiyaさん、yayadon さんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してみてください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    Yo48さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年8月15日 9:45
  • ご教授ありがとうございます。

    C#だと次のように書けば良いのですね。

     

       string[] str = { "abc", "xyz", "123", "567", "opq", "stu" };

     

       for( int i = 0; i < str.Length; i++ ) {

        // アイテムを作成
        ListBoxItem item = new ListBoxItem();
        item.Content = str[ i ];

     

        // XAMLに記した ListBox にアイテムを追加
        myListBox.Items.Add( item );

       }

     

      // ソート
      myListBox.Items.SortDescriptions.Add( new SortDescription( "Content", ListSortDirection.Ascending ) );

     

    不明な点が残っているのですが、SortDescription の使い方が良くわかりません。

    すなわち、次のコードではソートできません。SortDescription をどう書けばいいのでしょうか?

    それとも、Add( str[ i ] ) が間違いなのでしょうか?

     

       for( int i = 0; i < str.Length; i++ ) {

        // XAMLに記した ListBox にアイテムを追加
        myListBox.Items.Add( str[ i ] );

       }

     

      // ソート
      myListBox.Items.SortDescriptions.Add( new SortDescription( "Content", ListSortDirection.Ascending ) );

     

     

    C#と.NETの理解もそこそこにWPFに取り組んでいます。WPF以前の領域なのでしょうか?

    2008年8月17日 13:50
  •  Yo48 さんからの引用

    それとも、Add( str[ i ] ) が間違いなのでしょうか?

     

    間違いではないんでしょうけど,

    Stringクラスに指定可能なプロパティがないですからね。

     

    # ListBoxItem に包んでる時は,リンク先のように,

    # たまたまContentプロパティでやれて,楽できてると思った方がいいのかもしれません。

    2008年8月18日 20:27
  • SortDescriptionは別の機会で理解を深めることとします。

    本件は解決です。ありがとうございました。

     

    2008年8月24日 15:18

すべての返信

  • コードからソートを設定するのは比較的簡単です。

     

    (参考)
    WPF ListBox sorting?
    http://forums.msdn.microsoft.com/en-US/wpf/thread/4b1c1813-068a-443c-91b6-71481c417e5b/

     

    XAML側からですとCollectionViewSource.SortDescriptionsを使います。

     

    (参考)
    Mark's Blog of Random Thoughts
    http://www.julmar.com/blog/mark/PermaLink,guid,5716861f-5560-40c7-b700-483e0cd80116.aspx

    2008年8月3日 3:13
    モデレータ
  •  

    WPF の ListBox は,文字列を繰り返し表示するものでなく,

    オブジェクトを繰り返し表示するものなので,

    実際に,繰り返すのは,

    オブジェクトのコレクションのビュー順になります。

     

    データ・テンプレートが設定されていない場合は,

    ToString() を呼び出して返ってきたものが表示されるので,

    一見,Windowsフォーム の ListBox と似たように見えますが,

    仕組みは,まったく別物で,

    一行で,複数項目を表示可能なので,

    どちらかといえば,

    Windowsフォームのコントロールの中だと,

    ListBox ではなく DataGridView に近いものです。

    また,

    DataGridView は,データセットのビューを設定することも可能だし,

    直接値をセットしていくことも可能ですよね。

    それと同じように,

    WPF の ListBox も コレクション・ビューをセットすることも可能だし,

    直接指定することも可能になっています。

     

    (コレクション・ビュー というのは,簡単に書くと,

    コレクションの実際の順番を変更しないまま,

    アクセス順だけ変更するような感じにしたものです。

    なので,ひとつのコレクション(インスタンス)から

    複数のコレクション・ビューを持つことも可能です。)

     

    リンク先だと,

    ListBox側から順番指定可能のように見えてるけど,

    直接値を入れて行った場合は,

    内部で自動的にラップする形になっているので,

    しくみ的には,

    オブジェクトのどのメンバで並び替えるのかを

    コレクションビュー側でやっぱり指定している感じになってます。

     

    リンク先のように単純なものは,

    Contentプロパティを利用して楽することも可能だったりする場合もあるけど,

    他の場合は確かに面倒な場合が多いけど,

    逆にちょっと凝ったことをやりたい場合は,

    いわゆるListBox と違って,かなり楽な筈です。

     

     

     

     

     

     

    2008年8月3日 4:11
  • こんにちは。中川俊輔 です。

     

    trapemiyaさん、yayadon さん、回答ありがとうございます。

     

    Yo48さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、

    trapemiyaさん、yayadon さんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してみてください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    Yo48さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年8月15日 9:45
  • ご教授ありがとうございます。

    C#だと次のように書けば良いのですね。

     

       string[] str = { "abc", "xyz", "123", "567", "opq", "stu" };

     

       for( int i = 0; i < str.Length; i++ ) {

        // アイテムを作成
        ListBoxItem item = new ListBoxItem();
        item.Content = str[ i ];

     

        // XAMLに記した ListBox にアイテムを追加
        myListBox.Items.Add( item );

       }

     

      // ソート
      myListBox.Items.SortDescriptions.Add( new SortDescription( "Content", ListSortDirection.Ascending ) );

     

    不明な点が残っているのですが、SortDescription の使い方が良くわかりません。

    すなわち、次のコードではソートできません。SortDescription をどう書けばいいのでしょうか?

    それとも、Add( str[ i ] ) が間違いなのでしょうか?

     

       for( int i = 0; i < str.Length; i++ ) {

        // XAMLに記した ListBox にアイテムを追加
        myListBox.Items.Add( str[ i ] );

       }

     

      // ソート
      myListBox.Items.SortDescriptions.Add( new SortDescription( "Content", ListSortDirection.Ascending ) );

     

     

    C#と.NETの理解もそこそこにWPFに取り組んでいます。WPF以前の領域なのでしょうか?

    2008年8月17日 13:50
  •  Yo48 さんからの引用

    それとも、Add( str[ i ] ) が間違いなのでしょうか?

     

    間違いではないんでしょうけど,

    Stringクラスに指定可能なプロパティがないですからね。

     

    # ListBoxItem に包んでる時は,リンク先のように,

    # たまたまContentプロパティでやれて,楽できてると思った方がいいのかもしれません。

    2008年8月18日 20:27
  • SortDescriptionは別の機会で理解を深めることとします。

    本件は解決です。ありがとうございました。

     

    2008年8月24日 15:18
  • こんにちは。

    こちらはカスタマイズの方法です。


    //mListbox はListboxコントロールです。
    ICollectionView viewList = CollectionViewSource.GetDefaultView(mListbox.ItemSource);

    ListCollectionView listCollectionView = (ListCollectionView)viewList;
    // ソートのクラス
    listCollectionView.CustomSort = new YourCustomSort();

    viewList.Refresh();


        class
    YourCustomSort: IComparer
        {
            public int Compare( object x, object y )
            {
                  // あなたの開発分
              }
       }


    2008年10月9日 5:01