xamarin 如何使用具有可绑定布局的网格(多列)

webghufk  于 2023-06-20  发布在  其他
关注(0)|答案(4)|浏览(151)

在Xamarin.Forms3.5中,微软向我们介绍了可绑定的布局,它可以用于动态填充布局(例如:StackLayoutGrid等)。
在一个只有一列的网格中使用这个方法非常简单:

<Grid BindableLayout.ItemsSource="{Binding Items}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding MyProperty}"/>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</Grid>

现在我的问题是,由于DataTemplate只允许一个视图作为内容,如何使用它来填充一个包含多个列的网格。当然,我可以在其中添加另一个Grid,但这将完全抵消Grid中可绑定布局的价值。

ymdaylpp

ymdaylpp1#

现在我的问题是,由于DataTemplate只允许一个视图作为内容,如何使用它来填充一个包含多个列的网格。
Bindable Layouts可以看出:

  • 虽然在技术上可以将可绑定布局附加到任何从Layout类派生的布局类,但这样做并不总是可行的,特别是对于AbsoluteLayout,Grid和RelativeLayout类。例如,考虑这样一个场景:希望使用可绑定布局在Grid中显示数据集合,其中集合中的每个项都是包含多个属性的对象。Grid中的每一行都应显示集合中的一个对象,Grid中的每一列都应显示对象的一个属性。由于可绑定布局的DataTemplate只能包含单个对象,因此该对象必须是包含多个视图的布局类,每个视图在特定的Grid列中显示该对象的一个属性。虽然这种情况可以通过可绑定的布局来实现,但它会导致父网格包含绑定集合中每个项目的子网格,这是网格布局的非常低效和有问题的使用。

如果你还想多列,我建议你可以使用StackLayout,它也可以满足你的要求。

<StackLayout BindableLayout.ItemsSource="{Binding persons}">
        <BindableLayout.ItemTemplate>
            <DataTemplate>
                <StackLayout Orientation="Horizontal">
                    <Label Text="{Binding name}" />
                    <Label Text="{Binding age}" />
                </StackLayout>
            </DataTemplate>
        </BindableLayout.ItemTemplate>
    </StackLayout>
dbf7pr2w

dbf7pr2w2#

检查this issue,似乎你想要完成的事情不能用使用网格作为元素的绑定布局来完成。
然而,文档并不像它应该的那样清晰。

iszxjhcz

iszxjhcz3#

您可以订阅BindingContextChanged事件并配置所有项目。您必须在事件之后以编程方式配置网格定义。

gcuhipw9

gcuhipw94#

这可以通过属性绑定到Grid.RowGrid.Column来解决,例如

<Grid BindableLayout.ItemsSource="{Binding Items}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <Label Grid.Row="{Binding MyGridRowProperty}"
                   Grid.Column="{Binding MyGridColumnProperty}"
                   Text="{Binding MyProperty}"/>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</Grid>

相关问题