CollectionViewSourceを使ったグルーピングあれこれ【その2 GroupNameFromItemオーバーライド時の問題】
CollectionViewSourceを使ったグルーピングあれこれ【その1】
http://d.hatena.ne.jp/trapemiya/?_ts=1344387721
の、続きになります。えっと、前回紹介したコードは基本的なことだったので全く説明していなかったのですが、念のために軽く説明しておきますね。
前回のコードでの肝は、
groupDescription = new ランナーGroupDescription { PropertyName = "ランナーID" };
の部分です。グルーピングする際には基本的にPropertyGroupDescriptionクラスのインスタンスを作成し、CollectionViewSourceのPropertyGroupDescriptionに追加します。つまり、以下のようになります。
groupDescription = new PropertyGroupDescription { PropertyName = "ランナーID" };
しかし、このようにするとグルーピングのヘッダにはPropertyNameで指定した値が表示されてしまうのです。つまり、以下のようになります。
グルーピングヘッダにランナーIDが表示されてもあまりうれしくないですよね。よって、PropertyGroupDescriptionのGroupNameFromItemをオーバーライドして、ランナー名を返しているわけです。
class ランナーGroupDescription : PropertyGroupDescription { public override object GroupNameFromItem(object item, int level, System.Globalization.CultureInfo culture) { var uiobject = (ランナー)item; return uiobject.ランナー名; } }
んがっ、これで、めでたしめでたしとはいかないのです。
GroupNameFromItemをオーバーライドすると、GroupNameFromItemで返された値でグルーピングされてしまいます。これはなかなか気づきにくいところで、はまるところだと思います。試しに、ランナーIDが1である関西太郎さんと同姓同名であるランナーIDが3の関西太郎さんを以下のように追加してみましょう。
uiobjects.Add(new ランナー { 大会ID = 1, 大会名 = "サロマ100km", ランナーID = 3, ランナー名 = "関西太郎", タイム = new TimeSpan(10, 23, 11) });
結果は以下のようになります。
ランナー名でグルーピングされますから、同姓同名が混ざってしまっています。これはまずいですね。では、どう対応すれば良いのでしょうか?次回はこれについて触れたいと思います。