2011-06-21 12 views
1

ほとんどの場合、一部のデータとPropertyGroupDescriptionをグループ化しています。しかし、そのプロパティがDateTimeであり、複数の日付を1つのグループ(各グループなどの30日間など)にグループ化したくない場合は、新しいGroupDescriptionが必要です。問題はどのようにクラスが実際に動作するのか、どのようにそのようなクラスを設計するのか分かりません。DateTimeに基づくカスタムGroupDescriptionの作成

PropertyGroupDescription(基本抽象クラスではなく)を継承できることを期待しています。これもプロパティに基づいているためですが、ここでは単一の値ではなく値の範囲に基づいてグループ化しています。== 1グループ。

ガイドやこのような準備ができているクラスもありますか?

少し遅れ
+0

PropertyGroupDescriptionには、このような用途に使用できるIValueConverterパラメータがあることに気付きました。 –

答えて

4

が、あなたが自分自身を言うようIValueConverterはこのために使用することができます - ここで私は友好的、相対日付文字列によってその意志グループいったん使用される単純なコンバータです:

public class RelativeDateValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var v = value as DateTime?; 
     if(v == null) { 
      return value; 
     } 

     return Convert(v.Value); 
    } 

    public static string Convert(DateTime v) 
    { 
     var d = v.Date; 
     var today = DateTime.Today; 
     var diff = today - d; 
     if(diff.Days == 0) { 
      return "Today"; 
     } 

     if(diff.Days == 1) { 
      return "Yesterday"; 
     } 

     if(diff.Days < 7) { 
      return d.DayOfWeek.ToString(); 
     } 

     if(diff.Days < 14) { 
      return "Last week"; 
     } 

     if(d.Year == today.Year && d.Month == today.Month) { 
      return "This month"; 
     } 

     var lastMonth = today.AddMonths(-1); 
     if(d.Year == lastMonth.Year && d.Month == lastMonth.Month) { 
      return "Last month"; 
     } 

     if(d.Year == today.Year) { 
      return "This year"; 
     } 

     return d.Year.ToString(culture); 
    } 

    public static int Compare(DateTime a, DateTime b) 
    { 
     return Convert(a) == Convert(b) ? 0 : a.CompareTo(b); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

あなたはその後、同じようにそれを使用することができますこれは:

view.GroupDescriptions.Add(
    new PropertyGroupDescription("Property", 
     new RelativeDateValueConverter())); 
+0

ええ、すでにかなり同じソリューションが出ていたので、正しいとマークします。 –

関連する問題