【问题标题】:How can I make a Xamarin Forms CollectionView size to fit its contents?如何使 Xamarin Forms CollectionView 大小适合其内容?
【发布时间】:2021-10-29 15:23:14
【问题描述】:

我正在使用 Xamarin Forms CollectionView 来呈现分组的项目列表。每个项目都使用具有固定高度的DataTemplate 呈现,每个组标题都使用另一个具有固定高度的DataTemplate 呈现。

如何使CollectionView 的高度足够大以容纳其所有内容(项目、组标题和中间的空格),而无需滚动,也无需对高度进行硬编码?

这是我的 XAML。为简洁起见,我省略了网格的内容。

<CollectionView
    IsGrouped="True"
    ItemsSource="{Binding Items}"
    SelectedItems="{Binding SelectedItems}"
    SelectionMode="Multiple">
    <CollectionView.ItemsLayout>
        <LinearItemsLayout
            ItemSpacing="10"
            Orientation="Vertical" />
    </CollectionView.ItemsLayout>
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate>
            <Grid HeightRequest="20" />
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid HeightRequest="90" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

请注意,我不能使用BindableLayoutListView,因为我需要分组和多选。我也想在不破坏 MVVM 抽象的情况下做到这一点,所以理想情况下,我不希望视图模型中的任何内容了解行高。

非常感谢任何帮助。

【问题讨论】:

  • 您需要计算正确的高度并将HeightRequest分配给CollectionView
  • @ToolmakerSteve 感谢您的建议。该解决方案确实有效,但它通过让视图模型知道行高来破坏 MVVM 抽象,这应该是视图层的关注点。我已经更新了这个问题,以明确我正在使用 MVVM。理想情况下,我想要一个可以仅在视图层使用的问题 - 例如附加行为或类似行为。
  • 您可以将 BindableProperty 放在您的代码后面,并指定绑定路径为该引用 到当前视图类(不涉及到 VM 的 BindingContext,因此独立于 VM) . Here is a good Behavior example (for an email validator)。在“更新”部分,标签使用IsVisible="{Binding Source={x:Reference emailValidator},... 绑定到本地行为的属性。 (如果你得到这个工作,在下面添加“你的答案”,展示如何 - 我认为这对其他人有帮助。)

标签: xamarin.forms


【解决方案1】:

AbsoluteLayout 包裹它,这样你就可以设置HeightWidth
按屏幕大小的百分比或AbsoluteLayout 父布局大小

然后将CollectionViewHorizontalOptionVerticalOption
设置为FillAndExpand

【讨论】:

    猜你喜欢
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多