是否可以使用 IsGrouped=true 和 C# 中的 CollectionView.GroupHeaderTemplate 在 CollectionView 中获取所选项目的组键
Posted
技术标签:
【中文标题】是否可以使用 IsGrouped=true 和 C# 中的 CollectionView.GroupHeaderTemplate 在 CollectionView 中获取所选项目的组键【英文标题】:Is it possible to get the group key of the Selected Item in a CollectionView with IsGrouped=true and a CollectionView.GroupHeaderTemplate in C# 【发布时间】:2021-02-01 17:27:11 【问题描述】:我在 xamarin.Forms 应用程序中使用集合视图。我想识别 SelectedItem 的组键。 每个组中的项目不是唯一的。项目可以出现在多个组中。也许我可以使用 SelectionChangedCommand 并将 CommandParameter 指定为 GroupHeaderTemplate 中的 label.text?
【问题讨论】:
【参考方案1】:有可能。
基于Xamarin.Forms - CollectionView,我们可以使用SelectionChanged
方法来获取当前选中的项目。然后我们可以循环哪个组包含这个项目,因此 Group 的属性也会得到。
我们将VerticalListEmptyGroupsPage.Xaml代码修改如下:
<StackLayout Margin="20">
<CollectionView ItemsSource="Binding Animals"
SelectionChanged="CollectionView_SelectionChanged"
SelectionMode="Single"
IsGrouped="true">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="2"
Source="Binding ImageUrl"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60" />
<Label Grid.Column="1"
Text="Binding Name"
FontAttributes="Bold" />
<Label Grid.Row="1"
Grid.Column="1"
Text="Binding Location"
FontAttributes="Italic"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.GroupHeaderTemplate>
<DataTemplate>
<Label Text="Binding Name"
BackgroundColor="LightGray"
FontSize="Large"
FontAttributes="Bold" />
</DataTemplate>
</CollectionView.GroupHeaderTemplate>
<CollectionView.GroupFooterTemplate>
<DataTemplate>
<Label Text="Binding Count, StringFormat='Total animals: 0:D'"
Margin="0,0,0,10" />
</DataTemplate>
</CollectionView.GroupFooterTemplate>
</CollectionView>
</StackLayout>
和VerticalListEmptyGroupsPage.xaml.cs:
public partial class VerticalListEmptyGroupsPage : ContentPage
static GroupedAnimalsViewModel groupedAnimals;
public VerticalListEmptyGroupsPage()
InitializeComponent();
groupedAnimals= new GroupedAnimalsViewModel(true);
BindingContext = groupedAnimals;
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
Animal selectedAnimal = e.CurrentSelection[0] as Animal;
foreach (var animals in groupedAnimals.Animals)
foreach(var animal in animals)
if(animal == selectedAnimal)
Console.WriteLine(animals.Name);
DisplayAlert("Group Name", animals.Name, "OK");
效果:
================================更新=============== ======================
如果有多个组包含相同的Item,我认为最好的方法是设计包含Group key的item模型。
例如,Animal
模型可以设计如下:
public class Animal
public string GroupKey set; get;
public string Name get; set;
public string Location get; set;
public string Details get; set;
public string ImageUrl get; set;
public override string ToString()
return Name;
这种方式与数据库的外键类似。
【讨论】:
谢谢,但只有在所有动物都是独一无二的情况下才有效。如果一只动物出现在多个组中,它将不起作用。 @D.Foley Okey,如果在其他组中包含相同的项目。似乎需要专门设计包含 Group 键的项目模型。否则,我们应该无法知道哪个组包含它。我会更新答案。以上是关于是否可以使用 IsGrouped=true 和 C# 中的 CollectionView.GroupHeaderTemplate 在 CollectionView 中获取所选项目的组键的主要内容,如果未能解决你的问题,请参考以下文章