【发布时间】: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>
请注意,我不能使用BindableLayout 或ListView,因为我需要分组和多选。我也想在不破坏 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