Xaml Xamarin在CollectionView中形成行范围

Xaml Xamarin在CollectionView中形成行范围,xaml,xamarin,xamarin.forms,xamarin.android,xamarin.ios,Xaml,Xamarin,Xamarin.forms,Xamarin.android,Xamarin.ios,我有个问题。 我用一些虚拟交易创建了这个CollectionView,现在看起来像这样: 现在,这几乎与我想要的一样,除了一件事:我希望最后一列在两行上都得到一个rowspan,如下所示: 现在,如果这是一个常规的网格,我可以使用Grid.RowSpawn进行操作,但它位于CollectionView中,因为我可以进行很多交易。CollectionView的缺点是每一行都是不同的网格,因此它们实际上没有连接!这是我现在的代码: <CollectionView ItemsSource=&

我有个问题。 我用一些虚拟交易创建了这个CollectionView,现在看起来像这样:

现在,这几乎与我想要的一样,除了一件事:我希望最后一列在两行上都得到一个rowspan,如下所示:

现在,如果这是一个常规的网格,我可以使用Grid.RowSpawn进行操作,但它位于CollectionView中,因为我可以进行很多交易。CollectionView的缺点是每一行都是不同的网格,因此它们实际上没有连接!这是我现在的代码:

<CollectionView ItemsSource="{Binding agentOrderList}" Margin="0" HeightRequest="450">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid RowSpacing="0">
                <StackLayout Orientation="Vertical">
                    <StackLayout HorizontalOptions="FillAndExpand" HeightRequest="1" BackgroundColor="White"/>
                    <Grid RowSpacing="0" Margin="5,0,5,0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="21" />
                            <RowDefinition Height="21" />
                            <RowDefinition Height="4" />
                        </Grid.RowDefinitions>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="65" />
                            <ColumnDefinition Width="95" />
                            <ColumnDefinition Width="40" />
                            <ColumnDefinition Width="75" />
                            <ColumnDefinition Width="82" />
                        </Grid.ColumnDefinitions>

                        <Label Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" Text="{Binding Date}" FontAttributes="Bold" TextColor="#00D8FF" FontSize="18" VerticalOptions="CenterAndExpand"/>
                        <Label Grid.Row="0" Grid.RowSpan="2" Grid.Column="1" Text="{Binding Action}" TextColor="White" FontSize="18" VerticalOptions="CenterAndExpand"/>
                        <Label Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Text="{Binding Coin}" TextColor="White" FontSize="18" VerticalOptions="CenterAndExpand"/>
                        <Label Grid.Row="0" Grid.RowSpan="2" Grid.Column="3" Text="{Binding Price}" TextColor="White" FontSize="18" VerticalOptions="CenterAndExpand" HorizontalTextAlignment="End"/>
                        <Label Grid.Row="0" Grid.Column="4" Text="{Binding ProfitUSDT}" TextColor="{Binding ProfitColor}" FontSize="18" VerticalOptions="CenterAndExpand" HorizontalTextAlignment="End"/>
                        <Label Grid.Row="1" Grid.Column="4" Text="{Binding ProfitPerc}" TextColor="{Binding ProfitColor}" FontSize="18" VerticalOptions="CenterAndExpand" HorizontalTextAlignment="End"/>

                    </Grid>
                </StackLayout>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>
那么,实现这一目标的最佳方式是什么?我需要换一种观点吗?
请让我知道

ListView中的单元格之间不能有数据交叉,因此我认为需要使每个列表项都有一个两行网格,这样最后一列就可以跨两行

然而,我感到困惑。您的XAML代码似乎与一个单元格的屏幕截图不匹配。您的XAML代码似乎只分配了5列,但我在您的屏幕截图中看到了6列

在任何情况下,您都是正确的,您将需要使用一个网格来显示买卖数据,以便最后一列可以跨2行

更新:根据下面的评论,这里似乎需要DataTemplateSelector。见:

以上链接的部分摘录:

数据模板选择器支持ListView绑定等场景 到对象集合,其中每个对象在 可以在运行时通过数据模板选择器选择ListView 返回特定的数据模板

创建DataTemplateSelector数据模板选择器 通过创建继承自的类来实现 DataTemplateSelector。然后覆盖OnSelectTemplate方法 返回特定的DataTemplate,如下代码所示 例如:

OnSelectTemplate方法返回 基于DateOfBirth属性值的适当模板。 要返回的模板是ValidTemplate属性或 InvalidTemplate属性,在使用 PersonDataTemplateSelector

然后可以分配数据模板选择器类的实例 添加到Xamarin.Forms控件属性,如ListView.ItemTemplate。对于 有关有效属性的列表,请参见创建数据模板

局限性

DataTemplateSelector实例具有以下限制:

DataTemplateSelector子类必须始终返回相同的模板 对于同一数据,如果多次查询。 DataTemplateSelector子类不能返回另一个DataTemplateSelector子类。 DataTemplateSelector子类不能返回 每次调用的数据模板。相反,必须使用相同的实例 返回。否则将导致内存泄漏并禁用 虚拟化。 在Android上,最多可以有20种不同的 每个ListView的数据模板。 在XAML中使用DataTemplateSelector

在XAML中,PersonDataTemplateSelector可以通过 将其声明为资源,如以下代码示例所示:

此页面级ResourceDictionary定义了两个DataTemplate实例和一个 PersonDataTemplateSelector实例。PersonDataTemplateSelector 实例将其ValidTemplate和InvalidTemplate属性设置为 通过使用StaticResource标记选择适当的DataTemplate实例 扩大请注意,虽然资源是在页面的 ResourceDictionary,也可以在控制级别或 应用程序级别

PersonDataTemplateSelector实例通过将其分配给 ListView.ItemTemplate属性,如以下代码所示 例如:

在运行时,ListView调用 PersonDataTemplateSelector.OnSelectTemplate方法用于每个 基础集合中的项,调用传递数据 对象作为项参数。返回的数据模板 方法然后应用于该对象


是的,我很抱歉。。。我删除了已执行的列。问题是我可以有1个买入和1个卖出,所以我需要第2行,但我也可以有2个买入和1个卖出,所以我需要第3行,但如果我在一个列表中有一个列表怎么办。在第一个列表中,例如:Id,trades。在第二个列表中是单次销售,包括与之相关的所有购买。如何循环网格中的第二个列表?不推荐列表中的列表,手势可能会相互冲突,无论是使用Xamarin开发还是使用native开发都是如此。您可能需要创建多个DataTemplate和switch,这些DataTemplate和switch根据您希望在任何特定列表视图/集合视图单元格中显示的内容使用。您可以使用DataTemplateSelector执行此操作。见:
public class PersonDataTemplateSelector : DataTemplateSelector
{ 
    public DataTemplate ValidTemplate { get; set; }
    public DataTemplate InvalidTemplate { get; set; }

    protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
    {
        return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;   
     } 
 }
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Selector;assembly=Selector" x:Class="Selector.HomePage">
 <ContentPage.Resources>
     <ResourceDictionary>
         <DataTemplate x:Key="validPersonTemplate">
             <ViewCell>
                ...
             </ViewCell>
         </DataTemplate>
         <DataTemplate x:Key="invalidPersonTemplate">
             <ViewCell>
                ...
             </ViewCell>
         </DataTemplate>
         <local:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
             ValidTemplate="{StaticResource validPersonTemplate}"
             InvalidTemplate="{StaticResource invalidPersonTemplate}" />
     </ResourceDictionary>
 </ContentPage.Resources>   
    ... 
</ContentPage> 
<ListView x:Name="listView" ItemTemplate="{StaticResource personDataTemplateSelector}" />