是否可以使用 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 中获取所选项目的组键的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于与 all=TRUE 合并的 R dplyr 方法?

010-判断是否回传IsPostBack属性

在C中使用true和false

类似于子集和的算法的C/C++实现

Js如何判断数组为空

C++笔记第四章--类型和声明