4 Stimmen

Erstellen einer benutzerdefinierten GroupDescription basierend auf DateTime

Ich bin Gruppierung einige Daten und PropertyGroupDescription funktioniert gut die meiste Zeit. Wenn diese Eigenschaft jedoch eine DateTime ist und ich mehrere Daten als eine Gruppe gruppieren möchte (z. B. 30 Tage in jeder Gruppe oder so etwas), würde ich eine neue GroupDescription benötigen. Das Problem ist, dass ich keine Ahnung habe, wie die Klasse tatsächlich funktioniert und wie ich eine solche Klasse entwerfen würde.

Ich hoffe, in der Lage, PropertyGroupDescription (anstelle der grundlegenden abstrakten Klasse) zu erben, weil dies auch auf eine Eigenschaft basieren wird, aber hier bin ich Gruppierung basierend auf einem Bereich von Werten anstelle von einem einzigen Wert = = 1 Gruppe.

Gibt es einen Leitfaden oder sogar eine fertige Klasse wie diese?

9voto

Jacek Sieka Punkte 573

Ein bisschen spät, aber wie Sie selbst sagen IValueConverter kann dafür verwendet werden - hier ist ein einfacher Konverter, den ich einmal verwendet habe und der nach einem freundlichen relativen Datumsstring gruppiert:

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

Sie können es dann wie folgt verwenden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X