我不知道如何实现这一点,但我在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>
解决方法
转换器
// 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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。