c# – 使用Date对ListBox进行分组

我不知道如何实现这一点,但我在ListBox中有一个日期和时间列.如果日期已经存在,则不应显示日期列.我知道,结合ListCollectionView和Listview / DataGrids,它是可能的.但是我可以使用ListBox和List来实现这一点.请记住,我使用的是MVVM原理.这是我的列表框:

<ListBox Grid.Row="2" ScrollViewer.HorizontalScrollBarVisibility="disabled" ItemsSource="{Binding Schedules}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Background="Transparent">
                            <Grid Background="Transparent">
                                <Grid.ColumnDeFinitions>
                                    <ColumnDeFinition  Width="100"/>
                                    <ColumnDeFinition  Width="100"/>
                                    <ColumnDeFinition/>
                                </Grid.ColumnDeFinitions>
                                <Grid.RowDeFinitions>
                                    <RowDeFinition/>
                                </Grid.RowDeFinitions>
                                <TextBlock Grid.Column="0" Grid.Row="0"  Text="{Binding MyDateTime,StringFormat='d' }" HorizontalAlignment="Left"  VerticalAlignment="Center"/>
                                <TextBlock Grid.Column="1" Grid.Row="0"  Text="{Binding MyDateTime,StringFormat='t'}" HorizontalAlignment="Left"  VerticalAlignment="Center"/>
                                <TextBlock Grid.Column="2" Grid.Row="0"  Text="{Binding SomeText}"  TextTrimming="WordEllipsis" LinestackingStrategy="MaxHeight" MaxHeight="20" HorizontalAlignment="Left"  VerticalAlignment="Center"/>
                            </Grid>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

我在excel中做了这个,以举例说明我想要实现的目标:

enter image description here

我希望用黄色突出显示效果

解决方法

DateTimeText


转换器

// Order Schedules using System.Linq
public class ToOrderedListConverter : IValueConverter
{
    public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
    {
        List<ScheduleItem> schedules = (List<ScheduleItem>)value;
        var subset = from item in schedules
                     orderby item.MyDateTime.TimeOfDay
                     orderby item.MyDateTime.ToString("yyyy/MM/dd") descending
                     select item;
        return subset.ToList();
    }

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

// Show only first occurrence of date
public class DatetoVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values,CultureInfo culture)
    {
        DateTime currentItem = (DateTime)values[0];
        List<ScheduleItem> schedules = (List<ScheduleItem>)values[1];
        ScheduleItem firstOccurrence =
            schedules.Find(item => item.MyDateTime.Year == currentItem.Year
                                && item.MyDateTime.Month == currentItem.Month
                                && item.MyDateTime.Day == currentItem.Day);

        if (firstOccurrence.MyDateTime == currentItem)
            return Visibility.Visible;
        else return Visibility.Collapsed;
    }

    public object[] ConvertBack(object value,Type[] targettypes,CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML

<ListBox Grid.Row="2" ScrollViewer.HorizontalScrollBarVisibility="disabled"
         ItemsSource="{Binding Schedules,Converter={StaticResource ToOrderedListConverter}}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Background="Transparent">
                <Grid Background="Transparent">
                    <Grid.ColumnDeFinitions>
                        <ColumnDeFinition Width="100"/>
                        <ColumnDeFinition Width="100"/>
                        <ColumnDeFinition/>
                    </Grid.ColumnDeFinitions>
                    <Grid.RowDeFinitions>
                        <RowDeFinition/>
                    </Grid.RowDeFinitions>
                    <TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding MyDateTime,StringFormat='dd/MM/yyyy'}" HorizontalAlignment="Left" VerticalAlignment="Center">
                        <TextBlock.Visibility>
                            <MultiBinding Converter="{StaticResource DatetoVisibilityConverter}">
                                <Binding Path="MyDateTime"/>
                                <Binding RelativeSource="{RelativeSource AncestorType={x:Type ListBox}}" 
                                         Path="ItemsSource"/>
                            </MultiBinding>
                        </TextBlock.Visibility>
                    </TextBlock>
                    <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding MyDateTime,StringFormat='t'}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                    <TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding SomeText}"  TextTrimming="WordEllipsis" LinestackingStrategy="MaxHeight" MaxHeight="20" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </Grid>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...