You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grid控件新增项重叠而非自动换行的技术问题

Grid添加新项重叠,无法生成新行

问题现象

向Grid中添加新项时,新项会与最后一项处于同一单元格。多次点击按钮时,并未生成新行,而是在最后一项上方叠加新的exercise控件,它们在左上角单元格重叠,预期应为新项创建新行。

问题原因

XAML代码存在两个关键问题:

  • 使用BindableLayout.ItemsSource绑定ExercisesInGroup,但未定义BindableLayout.ItemTemplate,导致所有项复用同一套Grid内的控件,而非为每个项生成独立布局容器。
  • 所有输入框和按钮硬编码了Grid.Row="0",新增项会被强制渲染在同一行,最终造成重叠。

解决方案

修改XAML代码,为Grid配置BindableLayout.ItemTemplate,让每个Exercise对象生成独立的行结构:

<ViewCell>
 <!-- Display ExerciseType of the group -->
 <StackLayout Margin="0,0,0,0"
              x:Name="ExerciseStack">
     
     <Label Text="{Binding ExerciseType.Name}" FontSize="25" Padding="10" />
        
     <Grid x:Name="ExerciseGrid">
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="2*" />
             <ColumnDefinition Width="2*" />
             <ColumnDefinition Width="*" />
         </Grid.ColumnDefinitions>

         <!-- 为BindableLayout定义ItemTemplate,每个项对应一行 -->
         <BindableLayout.ItemsSource>
             <Binding Path="ExercisesInGroup" />
         </BindableLayout.ItemsSource>
         <BindableLayout.ItemTemplate>
             <DataTemplate>
                 <!-- 通过绑定项索引设置Grid行号 -->
                 <Grid Grid.Row="{Binding Source={RelativeSource AncestorType={x:Type ListView}}, Path=ItemsSource.IndexOf(.)}">
                     <Entry Grid.Column="0" Placeholder="Reps" Keyboard="Numeric" Text="{Binding Reps}" />
                     <Entry Grid.Column="1" Placeholder="Volume" Keyboard="Numeric" Text="{Binding Weight}" />
                     <Button Grid.Column="2" Text="Complete" Command="{Binding Source={RelativeSource AncestorType={x:Type ViewModels:WorkoutViewModel}}, Path=CompleteExerciseCommand}" />
                 </Grid>
             </DataTemplate>
         </BindableLayout.ItemTemplate>
     </Grid>
     <Button Text="Add Exercise" Command="{Binding BindingContext.AddExerciseToGroupCommand, Source={x:Reference Workouts}}" VerticalOptions="End"/>
 </StackLayout>
</ViewCell>

如果不想在XAML中处理索引绑定,也可以在Exercise类中新增RowIndex属性,在添加新项时手动赋值行号,再绑定到Grid.Row上,逻辑会更清晰。

代码验证

你的C#逻辑无需修改:

  • 正确创建Exercise对象并添加到ObservableCollection<Exercise>
  • 分组不存在时自动创建新分组并加入集合
  • ObservableCollection会自动通知UI更新,数据绑定逻辑正常

内容的提问来源于stack exchange,提问作者dancho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:33:29