trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

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) });

結果は以下のようになります。

ランナー名でグルーピングされますから、同姓同名が混ざってしまっています。これはまずいですね。では、どう対応すれば良いのでしょうか?次回はこれについて触れたいと思います。