XAML ListView 元素内的小型多列列表

XAML small Multicolumn List inside LiesView Element

在我的 Xamarin 应用程序中,我有一个 ListView,在 ItemTemplate 中,我必须显示一个包含 3 列的纯文本列表。

第一个想法是使用 GroupedListView,但在这种情况下,所有子条目都可以单独选择。 那不是我想要的。 ListView 项应显示为一个可选元素。

我在研究中发现的第二个想法是通过代码添加 Gridview 行,但这会破坏我的 MVVM 概念。我需要一个仅适用于数据绑定的解决方案。

我有时读到的第三件事是:在 ListView 内级联 ListView。但大多数人对这种想法的回答是:“永远不要这样做”。

还有其他想法吗? 我想要的是这样的:

ListView Entry 1
     04:13      Jhonny           3,24$
     09:45      Some Long Nam... 8,23$
     14:42      Mike             5,45$
----------------------------------------
ListView Entry 2
     07:13      Jhonny           3,24$
     11:22      Some Long Nam... 8,23$
     18:42      Mike             5,45$
----------------------------------------
ListView Entry 3
     05:13      Jhonny           3,24$
     15:45      Some Long Nam... 8,23$
     19:42      Mike             5,45$
----------------------------------------

始终应将整个 Listview 条目作为一个元素进行选择。

猜猜您可以使用 BindableLayout。你没有指定类型,所以我做了一个虚拟类型。 查看:

<CollectionView ItemsSource="{Binding GroupItems}" SelectionMode="Single">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <StackLayout Orientation="Vertical" Margin="5">
                <Label Text="{Binding Title}"/>
                <StackLayout BindableLayout.ItemsSource="{Binding Entries}">
                    <BindableLayout.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding Time}" HorizontalTextAlignment="Center"/>
                                <Label Text="{Binding Name}" Grid.Column="1" LineBreakMode="TailTruncation"/>
                                <Label Text="{Binding Amount}" Grid.Column="2" HorizontalTextAlignment="Center"/>
                            </Grid>
                        </DataTemplate>
                    </BindableLayout.ItemTemplate>
                  
                </StackLayout>
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

代码隐藏:

 public ObservableCollection<GroupItem> GroupItems { get; set; } = new ObservableCollection<GroupItem>();
    public MainPage()
    {
        InitializeComponent();
        BindingContext = this;
        GroupItem item1 = new GroupItem();
        item1.Title = "Entry 1";
        item1.Entries.Add(new Entry { Time = "10:13", Name = "Johnny", Amount = "10,24$" });
        item1.Entries.Add(new Entry { Time = "12:11", Name = "Some long name that will be truncated", Amount = "20,14$" });
        item1.Entries.Add(new Entry { Time = "10:13", Name = "Mike", Amount = "14,27$" });
        GroupItems.Add(item1);  

        GroupItem item2 = new GroupItem();
        item2.Title = "Entry 2";
        item2.Entries.Add(new Entry { Time = "11:13", Name = "Finn", Amount = "10,24$" });
        item2.Entries.Add(new Entry { Time = "14:11", Name = "Some long name that will be truncated", Amount = "20,14$" });
        GroupItems.Add(item2);
        
        GroupItem item3 = new GroupItem();
        item3.Title = "Entry 3";
        item3.Entries.Add(new Entry { Time = "11:13", Name = "Finn", Amount = "10,24$" });
        item3.Entries.Add(new Entry { Time = "14:11", Name = "Some long name that will be truncated", Amount = "20,14$" });
        item3.Entries.Add(new Entry { Time = "14:11", Name = "Martin", Amount = "50,15$" });
        item3.Entries.Add(new Entry { Time = "14:11", Name = "Elon musk", Amount = "30,14$" });
        GroupItems.Add(item3);
    }

    public class GroupItem
    {
        public string Title { get; set; }
        public List<Entry> Entries { get; set; } = new List<Entry>();
    }

    public class Entry 
    {
        public string Time { get; set; }
        public string Name { get; set; }
        public string Amount { get; set; }
    }

这为您提供了动态行数的可能性,并且每个组都是可选的。

结果: