我的collectionView中有这段代码:
<RefreshView>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CollectionView
ItemsSource="{Binding Comments}"
SelectionMode="Single">
<CollectionView.ItemsLayout>
<LinearItemsLayout Orientation="Vertical" ItemSpacing="5" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Comment">
<Frame Style="{StaticResource CardView}" CornerRadius="10">
<Grid RowDefinitions="Auto, Auto, Auto, *" ColumnDefinitions="80, 250" ColumnSpacing="5">
...
</Grid>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.EmptyView>
<ContentView>
<StackLayout>
<Label
Text="Some text here"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center" />
</StackLayout>
</ContentView>
</CollectionView.EmptyView>
</CollectionView>
<Button
...
</Button>
<Button
...
</Button>
</Grid>
</RefreshView>
奇怪的行为......当我用空集合启动程序时,当然,我看到......什么也没有。没有标签。
运行时,我对文本进行了一些更改,无论如何,我在末尾插入一个*,例如:Text =“此处有文本*”,瞧,突然我的文本在我的屏幕中间 - 预期的行为!
我在模拟器和Android本地设备中都尝试过。同样的行为。
我还尝试在运行时设置该标签的标题 - 没有骰子。
我尝试过使用图像而不是标签。同样的事情也会发生。
一旦我对 EmptyView 的内容进行了更改,无论更改如何,EmptyView 都会在会话的剩余时间内显示其内容。如果我不这样做,它将永远保持空白。
有什么办法解决这个问题吗?
谢谢你。亚历克斯.
这可能对你的情况没有帮助,但我也在努力让 EmptyView 开箱即用地正常工作。根据您的上一条评论,我能够通过在 OnNavigedTo 事件处理程序中调整 CollectionView 的高度和宽度来显示空内容。 (当我单步执行代码时,我注意到两个属性都已初始化为 -1。)
不幸的是,此修复具有副作用,当我将项目添加到列表中时,我的 CollectionView 无法正确调整大小。
截至今天(3/24/23)仍有一个关于此问题的开放 Github 票证:
Android - CollectionView EmptyView 不可见 #10819
根据另一张票证,我找到了一种解决方法,通过将 CollectionView 包装在 RefreshView 中来解决 EmptyView 问题。我实际上并不想要刷新功能,所以我像这样禁用了它:
<RefreshView IsEnabled="False">
<CollectionView ItemsSource="{Binding FavoriteLocations}">
<CollectionView.EmptyView>
<ContentView>
. . .
</ContentView>
</CollectionView.EmptyView>
</CollectionView>
</RefreshView>
值得庆幸的是,即使未启用 RefreshView,该技巧也能发挥作用。
编辑(5/2/23):自从这篇文章以来,我发现 RefreshView hack 在放置在另一个滚动条内部时不起作用。我在一个滚动中显示了多个集合,这种模式完全破坏了我的 CollectionViews。
最终,我们废弃了所有 CollectionView 元素并采用以下模式:
<StackLayout BindableLayout.ItemsSource="{Binding MyList}">
<BindableLayout.EmptyView>
<Border BackgroundColor="White" Margin="0,5,0,0">
<Label Text="No items are available." />
</Border>
</BindableLayout.EmptyView>
<BindableLayout.ItemTemplate>
<DataTemplate>
<!--Display collection items as normal here-->
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
EmptyView 开箱即用,没有任何不必要的解决方法。我建议使用 BindableLayouts,直到 MAUI 解决 CollectionViews 周围的所有错误。
我找到了一个非常简单的解决方法。只需将 CollectionView 标记中的 EmptyView 属性设置为空白字符串,然后 EmptyViewTemplate 标记之间的任何内容都会显示出来。
<CollectionView
IsVisible="{Binding IsVisible, Mode=TwoWay}"
ItemsSource="{Binding MyCollection, Mode=TwoWay}"
SelectionMode="Single"
VerticalScrollBarVisibility="Default"
>
EmptyView=""
>
SelectedItem="{Binding SelectedItem}"
SelectionChanged="ListView_OnItemTapped">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<controls:MyListControl />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.EmptyViewTemplate>
<DataTemplate>
<Label Text="No Results to display"
TextColor="LightGray"
HorizontalTextAlignment="Center"
FontSize="55"
FontAttributes="Bold" />
</DataTemplate>
</CollectionView.EmptyViewTemplate>
</CollectionView>