均为x:bind绑定,主要是类的设定.
效果:
gridview xaml
使用了 UWP社区toolkit工具包美化,使用原版GridView同理
<GridView ScrollViewer.IsHorizontalScrollChainingEnabled="False" ItemContainerStyle="{StaticResource GridviewContainerStyle}" ItemClick="GridViewItem_Click" x:Name="GridView" SelectionMode="None" ItemsSource="{x:Bind cvsGroups.View,Mode=OneWay}" HorizontalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" VerticalAlignment="Stretch" IsItemClickEnabled="True"> <GridView.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate x:DataType="local:ImageGroup"> <StackPanel Padding="10 35 0 0" VerticalAlignment="Top" Orientation="Horizontal" Height="65"> <TextBlock VerticalAlignment="Center" Text="{x:Bind GroupName,Mode=OneWay}" FontWeight="Medium" FontSize="16" Foreground="Black" HorizontalAlignment="Left"> </TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Margin="10 0 3 0" >共</TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{x:Bind ImageObjects.Count}"></TextBlock> <TextBlock VerticalAlignment="Center" FontSize="14" >张</TextBlock> </StackPanel> </DataTemplate> </GroupStyle.HeaderTemplate> <GroupStyle.Panel> <ItemsPanelTemplate> <controls:StaggeredPanel x:Name="adptiveWidth" HorizontalAlignment="Stretch" VerticalAlignment="Top" DesiredColumnWidth="250" /> </ItemsPanelTemplate> </GroupStyle.Panel> </GroupStyle> </GridView.GroupStyle> <GridView.ItemTemplate> <DataTemplate x:DataType="local:ImageBrushAndFileInfo"> <controls:ImageEx gif:AnimationBehavior.RepeatBehavior="Forever" Name="ImageExControl" IsCacheEnabled="True" PlaceholderSource="/Assets/loading.png" Stretch="Fill" Source="{x:Bind bitmapImage,Mode=OneWay}"> <ToolTipService.ToolTip> <ToolTip> <StackPanel> <TextBlock FontSize="16" Text="{x:Bind file.Name,Mode=OneWay}"></TextBlock> <TextBlock Text="{x:Bind file.DateCreated.UtcDateTime,Mode=OneWay}"></TextBlock> </StackPanel> </ToolTip> </ToolTipService.ToolTip> </controls:ImageEx> </DataTemplate> </GridView.ItemTemplate> <GridView.ItemsPanel> <ItemsPanelTemplate> <!--<controls:WrapPanel Orientation="Horizontal" Padding="0,0,0,0" VerticalSpacing="5" HorizontalSpacing="5" />--> </ItemsPanelTemplate> </GridView.ItemsPanel> </GridView>
另外:
<Page.Resources> <CollectionViewSource x:Name="cvsGroups" Source="{x:Bind ImageGroups,Mode=OneWay}" ItemsPath="ImageObjects" IsSourceGrouped="True" > </CollectionViewSource> </Page.Resources>注意ItemsPath和数据模型对应
后台对应的类
public class ImageGroup : INotifyPropertyChanged { public string GroupName { get; set; } public ObservableCollection<ImageBrushAndFileInfo> _ImageObjects = new ObservableCollection<ImageBrushAndFileInfo>(); public ObservableCollection<ImageBrushAndFileInfo> ImageObjects { get { return _ImageObjects; } set { SetProperty(ref _ImageObjects, value); } } public ImageGroup() { } private bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) { if (object.Equals(storage, value)) return false; storage = value; this.OnPropertyChanged(propertyName); return true; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = "") { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class ImageBrushAndFileInfo : INotifyPropertyChanged { private BitmapImage _bitmapImage; public BitmapImage bitmapImage { get { return _bitmapImage; } set { SetProperty(ref _bitmapImage, value); } } private StorageFile _file; public StorageFile file { get { return _file; } set { SetProperty(ref _file, value); } } // -------- private string _foldername="folder"; public string foldername { get { return _foldername; } set { SetProperty(ref _foldername, value); } } // -------- //实现INotify接口 public event PropertyChangedEventHandler PropertyChanged; private bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) { if (object.Equals(storage, value)) return false; storage = value; this.OnPropertyChanged(propertyName); return true; } private void OnPropertyChanged([CallerMemberName] string propertyName = "") { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
code behind (MainPage)具属性如下,绑定前面的CollectionViewSource
public ObservableCollection<ImageGroup> _ImageGroups = new ObservableCollection<ImageGroup>(); public ObservableCollection<ImageGroup> ImageGroups { get { return _ImageGroups; } set { SetProperty(ref _ImageGroups, value); } }
设置CollectionViewSource的items属性理论上可以更灵活的构造后台数据对象.