C# Xamarin表单:按日期分组listview

C# Xamarin表单:按日期分组listview,c#,listview,xamarin.forms,C#,Listview,Xamarin.forms,我希望能够在按日期分组的列表视图中显示事件列表 列表中的项目已经包含了时间,所以每个组的标题应该只是日期 解决此问题的一种方法是将模型DateTime转换为格式为“yyyy/MM/dd”的字符串,并为组指定此标题。但我想向用户显示“18/02-2017” 此外,如果是今天,我希望它有组名“今天” 我不知道如何实现这一点。詹姆斯·蒙特马诺(James Montemagno)有一篇关于在列表视图中分组的精彩教程,位于: 在您的案例中,您可以使用他在教程中所讨论的内容,并向您的模型添加一个特殊的只读

我希望能够在按日期分组的列表视图中显示事件列表

列表中的项目已经包含了时间,所以每个组的标题应该只是日期

解决此问题的一种方法是将模型DateTime转换为格式为“yyyy/MM/dd”的字符串,并为组指定此标题。但我想向用户显示“18/02-2017”

此外,如果是今天,我希望它有组名“今天”


我不知道如何实现这一点。

詹姆斯·蒙特马诺(James Montemagno)有一篇关于在列表视图中分组的精彩教程,位于:

在您的案例中,您可以使用他在教程中所讨论的内容,并向您的模型添加一个特殊的只读属性。该属性返回所需格式的字符串,如果当前日期与日期字段匹配,则返回“Today”。然后可以使用该字段分组。可以对“实际日期”属性进行排序,该属性应将“今天”放在列表的顶部

public string GroupDate
{
    get 
    {
        if(YourDateProperty.Date == DateTime.Now.Date)
            return "Today";
        else
            return YourDateProperty.ToString("dd/MM-yyyy");
    }
}

James Montemagno有一个关于在列表视图中分组的不错的教程,网址是:

在您的案例中,您可以使用他在教程中所讨论的内容,并向您的模型添加一个特殊的只读属性。该属性返回所需格式的字符串,如果当前日期与日期字段匹配,则返回“Today”。然后可以使用该字段分组。可以对“实际日期”属性进行排序,该属性应将“今天”放在列表的顶部

public string GroupDate
{
    get 
    {
        if(YourDateProperty.Date == DateTime.Now.Date)
            return "Today";
        else
            return YourDateProperty.ToString("dd/MM-yyyy");
    }
}

在我看来,简单的方法是使用自定义转换器:

class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        if (date.Equals(DateTime.Today))
        {
            return "Today";
        }
        return date.Day.ToString().PadLeft(2,'0') + @"/" + date.Month.ToString().PadLeft(2, '0') + "-" + date.Year;
    }
}
使用此转换器,您可以同时获得“今天”(如果值为今天)和格式为dd/MM yyyy的日期

您可以这样使用转换器:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:DateConverter x:Key="DateConverter" />
    </ResourceDictionary>
</ContentPage.Resources>
<StackLayout>
    <ListView
        GroupDisplayBinding="{Binding Date, Converter={StaticResource DateConverter}}"
        IsGroupingEnabled="True"
        ItemsSource="{Binding Events}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding Name}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

这就是结果:


我希望这能对您有所帮助。

在我看来,最简单的方法是使用自定义转换器:

class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        if (date.Equals(DateTime.Today))
        {
            return "Today";
        }
        return date.Day.ToString().PadLeft(2,'0') + @"/" + date.Month.ToString().PadLeft(2, '0') + "-" + date.Year;
    }
}
使用此转换器,您可以同时获得“今天”(如果值为今天)和格式为dd/MM yyyy的日期

您可以这样使用转换器:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:DateConverter x:Key="DateConverter" />
    </ResourceDictionary>
</ContentPage.Resources>
<StackLayout>
    <ListView
        GroupDisplayBinding="{Binding Date, Converter={StaticResource DateConverter}}"
        IsGroupingEnabled="True"
        ItemsSource="{Binding Events}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding Name}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

这就是结果:

我希望这能帮助你