好的,所以使用 Grouped GridView 的基本要求是:
(注意:所有类名都是任意的)
- 一个 ViewModel(你使用的是 Mvvm,对吗?)
- 一个 Group 对象,其中包含每个组的元素。
- 一个 Item 对象, Group 将包含一个集合
- 用于显示包含 GridView 和 CollectionViewSource 的项目的视图(包括组和项目的任何样式)
示例组和项目:
public class Group<T> where T : Item
{
public ObservableCollection<T> Items { get; set;}
public string Title { get; set; }
}
public class Item
{
public string Value { get; set; }
}
一个示例视图模型:
public class GroupsViewModel : ViewModelBase // This implementation uses Mvvm Light's ViewModelBase, feel free to use any
{
public ObservableCollection<Group<Item>> AllGroups { get; set; }
public GroupsViewModel()
{
AllGroups = new ObservableCollection<Group<Item>>();
Group<Item> group1 = new Group<Item>();
group1.Title = "Group 1 Title";
group1.Add(new Item(){ Value = "The first value." });
AllGroups.Add(group1);
Group<Item> group2 = new Group<Item>();
group2.Title = "Group 2 Title";
group2.Add(new Item(){ Value = "The second value." });
}
}
在您的页面上,在您的 Page.Resources 中创建一个 CollectionViewSource:
<Page.Resources>
<CollectionViewSource Source="{Binding AllGroups}"
IsSourceGrouped=True
ItemsPath="Items"
x:Name="GroupedCollection"/>
</Page.Resources>
请注意,Source 绑定到Collection
s Group
,并且ItemsPath
告诉s 在每个属性CollectionViewSource
中的集合。Item
Group
你GridView
会参考这个。如下所示设置项目来源很重要。一个空{Binding}
的,Source
设置为StaticResource
的CollectionViewSource
。GridView
您可以使用GroupStyle
类似这样的方式来设置每个组的样式。我把它剥离得非常基础。您已经拥有的默认示例将有一个更好的示例。
<GridView ItemsSource="{Binding Source={StaticResource GroupedCollection}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Margin="1,0,0,6">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" Margin="3,-7,10,10" Style="{StaticResource GroupHeaderTextStyle}" />
<TextBlock Text="{StaticResource ChevronGlyph}" FontFamily="Segoe UI Symbol" Margin="0,-7,0,10" Style="{StaticResource GroupHeaderTextStyle}"/>
</StackPanel>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Vertical" Margin="0,0,80,0"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
最后,您必须将DataContext
您Page
的设置为ViewModel
. 如果您使用的是 Mvvm Light,它将类似于DataContext="{Binding GroupsVM, Source={StaticResource Locator}}"
. 您显然需要进行一些进一步的设置才能使其正常工作。您也可以在Page
构造函数中设置它。
public MyGridViewPage()
{
DataContext = new GroupsViewModel();
this.InitializeComponent();
}
希望这可以帮助。快乐编码!