C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: ObservableCollectionのソート


(過去ログ 61 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■34953 / inTopicNo.1)  ObservableCollectionのソート
  
□投稿者/ 倉田 有大 (559回)-(2009/04/15(Wed) 00:30:41)

分類:[.NET 全般] 

2009/04/15(Wed) 00:41:28 編集(投稿者)

List()と比べると、AddRangeがなかったり、ソートがなかったりちょっと不便ですね。
ObservableCollectionのソートはみなさん、どうやって実装されているのでしょうか? 自力?

ところで、DLLに追加しようとしたら、WindowsBaseを参照しないといけないんですね。しばらく悩みました。
引用返信 編集キー/
■34956 / inTopicNo.2)  Re[1]: ObservableCollectionのソート
□投稿者/ επιστημη (1885回)-(2009/04/15(Wed) 04:17:18)
επιστημη さんの Web サイト
> List()と比べると、AddRangeがなかったり、ソートがなかったりちょっと不便ですね。
> ObservableCollectionのソートはみなさん、どうやって実装されているのでしょうか? 自力?

ObservableCollectionをソートすると要素交換のたんびにイベントが飛びまくり、
Observerはたまったもんじゃないよな希ガスっです。

引用返信 編集キー/
■34962 / inTopicNo.3)  Re[2]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (560回)-(2009/04/15(Wed) 15:48:02)
> ObservableCollectionをソートすると要素交換のたんびにイベントが飛びまくり、
> Observerはたまったもんじゃないよな希ガスっです。

あー、やっぱりそうですか^^;
調べても、一時的にイベントをとめるメソッドとかはなさそうですね。
新しいソートしたObservableCollectionを作成して、取り替えるのがいいかな?

みなさんどうやってるんだろう?ListViewのDataContextにバインドした要素のソートは。

引用返信 編集キー/
■34963 / inTopicNo.4)  Re[3]: ObservableCollectionのソート
□投稿者/ επιστημη (1886回)-(2009/04/15(Wed) 16:02:50)
επιστημη さんの Web サイト
> 調べても、一時的にイベントをとめるメソッドとかはなさそうですね。

CollectionChangedEventをリスナに配送する
CollectionChangedEventManagerにStopListening/StartListening
ちゅーメソッドがあるみたいっす。

引用返信 編集キー/
■34971 / inTopicNo.5)  Re[4]: ObservableCollectionのソート
□投稿者/ Hongliang (360回)-(2009/04/15(Wed) 18:18:03)
CollectionView / CollectionViewSource を使うのが一般的じゃないすかね。
引用返信 編集キー/
■34976 / inTopicNo.6)  Re[5]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (561回)-(2009/04/15(Wed) 22:39:59)
επιστημηさんHongliangさん、ありがとうございます。
ぐぐって調べてみました。

まだまだ日本語の情報は少ないですねーT^T
特にこれが、ぜんぜん引っかからない→CollectionChangedEventManager

>CollectionView

こっちだと、ビュー側でソートするんですね。

教えてもらった情報を元にいろいろと試してみようとおもいます。
ありがとうございましたー。
引用返信 編集キー/
■34978 / inTopicNo.7)  Re[6]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (562回)-(2009/04/16(Thu) 00:05:41)
2009/04/16(Thu) 00:09:29 編集(投稿者)
今日の成果ですが、こんなソースしかかけませんでした><
しかも、ソートしてくれなーいヽ( ̄∇ ̄;)ノ
ちょっと休憩。

namespace sortlistbox
{
  
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        ObservableCollection<Person> list = new ObservableCollection<Person>();
        CollectionViewSource list2 = new CollectionViewSource();

        public Window1()
        {
            InitializeComponent();

            Person p1 = new Person();
            p1.Name = "name1";
            Person p2 = new Person();
            p2.Name = "name3";
            Person p3 = new Person();
            p3.Name = "name5";
            Person p4 = new Person();
            p4.Name = "name4";
            Person p5 = new Person();
            p5.Name = "name2";
            list.Add(p1);
            list.Add(p2);
            list.Add(p3);
            list.Add(p4);
            list.Add(p5);
            list2.Source = list;
            listBox1.DataContext = list;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            list2.SortDescriptions.Clear();
            list2.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending));            
        }
    }

    public class Person
    {
        public string Name { set; get; }
    }
}

<Window x:Class="sortlistbox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:sortlistbox"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="personViewTemplate" DataType="{x:Type local:Person}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}"/>   
                <TextBlock Text="さん " />                   
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox  ItemsSource="{Binding}"  Margin="76,68,82,94" Name="listBox1" ItemTemplate="{StaticResource personViewTemplate}"/>
        <Button Height="23" Margin="104,19,99,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button>
    </Grid>
</Window>



listBox1.Items.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending));        

↑こっちだとソートしてくれました。CollectionViewSourceの使い方がわからない^^;

引用返信 編集キー/
■34979 / inTopicNo.8)  Re[7]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (563回)-(2009/04/16(Thu) 00:12:44)
2009/04/16(Thu) 00:43:42 編集(投稿者)
2009/04/16(Thu) 00:20:27 編集(投稿者)

ICollectionView collectionView = CollectionViewSource.GetDefaultView(listBox1.ItemsSource);
collectionView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending));

上と

ObservableCollection<Person> list = new ObservableCollection<Person>();
CollectionViewSource list2 = new CollectionViewSource();

list2.Source = list;

これは、意味合いが違うんでしょうか?
最初の例だとソートしてくれました。

引用返信 編集キー/
■34980 / inTopicNo.9)  Re[8]: ObservableCollectionのソート
□投稿者/ Hongliang (361回)-(2009/04/16(Thu) 01:09:05)
> list2.Source = list;
> listBox1.DataContext = list;
GUI に CollectionViewSource が関われていません。
引用返信 編集キー/
■34982 / inTopicNo.10)  Re[9]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (564回)-(2009/04/16(Thu) 02:06:16)
2009/04/16(Thu) 02:39:40 編集(投稿者)
No34980 (Hongliang さん) に返信
>>list2.Source = list;
>>listBox1.DataContext = list;
> GUI に CollectionViewSource が関われていません。

ですよねorz 

 http://msdn.microsoft.com/ja-jp/library/system.windows.data.collectionview.aspx

というか、CollectionViewはコード内で作成しないでくださいと書かれていますね。

CollectionViewSource.GetDefaultView
上をつかえとかいているので、使うことにします。

ちなみに下記のようにCollectionViewSourceを使ってみたのですが、エラーは出ませんでしたが、やはりソートできませんでした。

あー、XAMLは難しいな2時過ぎたので、体壊すので休憩しますー

    public partial class Window1 : Window
    {
        ObservableCollection<Person> list = new ObservableCollection<Person>();
        CollectionViewSource list2 = new CollectionViewSource();
        ICollectionView i;

        public Window1()
        {
            InitializeComponent();

            Person p1 = new Person();
            p1.Name = "name1";
            Person p2 = new Person();
            p2.Name = "name3";
            Person p3 = new Person();
            p3.Name = "name5";
            Person p4 = new Person();
            p4.Name = "name4";
            Person p5 = new Person();
            p5.Name = "name2";
            list.Add(p1);
            list.Add(p2);
            list.Add(p3);
            list.Add(p4);
            list.Add(p5);
            listBox1.ItemsSource = list;
            list2.Source = listBox1.ItemsSource;
            i = list2.View;            
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {           
            i.SortDescriptions.Clear();
            i.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending));                        
        }
    }

引用返信 編集キー/
■34985 / inTopicNo.11)  Re[10]: ObservableCollectionのソート
□投稿者/ 倉田 有大 (566回)-(2009/04/16(Thu) 04:47:14)
2009/04/16(Thu) 05:42:21 編集(投稿者)

επιστημη さんの方法を調べてみましたが、

hhttp://msdn.microsoft.com/ja-jp/library/system.collections.specialized.collectionchangedeventmanager(VS.80).aspx

えーい、具体的な実装方法を書いててくれーい
http://shevaspace.spaces.live.com/blog/cns!FD9A0F1F8DD06954!471.entry?dir=Next&ph=FD9A0F1F8DD06954!1528
例らしきものを見つけましたが、なにがなんだかわからん^^;

INotifyCollectionChangedとIListを継承して自分でコレクションつくるのもありかな。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -