MAUI <CollectionView.EmptyView> 不会显示,直到手动更改文本

Ale*_*lex 8 collectionview maui

我的 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>
Run Code Online (Sandbox Code Playgroud)

奇怪的行为......当我用空集合启动程序时,当然,我看到......什么也没有。无标签。

运行时,我稍微更改文本,无论如何,我在末尾插入一个*,例如:Text =“Some text gone here *”,瞧,突然我的文本在中间正确显示我的屏幕 - 预期的行为!

我在模拟器和Android本地设备中都尝试过。同样的行为。

我还尝试在运行时设置该标签的标题 - 没有骰子。

我尝试过使用图像而不是标签。同样的事情也会发生。

一旦我对 EmptyView 的内容进行了更改,无论更改如何,EmptyView 都会在会话的剩余时间内显示其内容。如果我不这样做,它将永远保持空白。

有什么办法解决这个问题吗?

谢谢。亚历克斯.

Mad*_*bot 6

这可能为时已晚,对您的情况没有帮助,但我也在努力让 EmptyView 开箱即用地正常工作。根据您的上一条评论,我能够通过在 OnNavigedTo 事件处理程序中调整 CollectionView 的高度和宽度来显示空内容。(当我单步执行代码时,我注意到两个属性都已初始化为 -1。)

不幸的是,此修复具有副作用,当我将项目添加到列表中时,我的 CollectionView 无法正确调整大小。

截至今天(23 年 3 月 24 日),仍有一个关于此问题的开放 Github 票证:

Android - CollectionView EmptyView 不可见 #10819

根据另一张票证,我找到了一种解决方法,通过将 CollectionView 包装在 RefreshView 中来解决 EmptyView 问题。我实际上并不想要刷新功能,所以我像这样禁用了它:

<RefreshView IsEnabled="False">
     <CollectionView ItemsSource="{Binding FavoriteLocations}">
          <CollectionView.EmptyView>
               <ContentView>
                    . . .
               </ContentView>
          </CollectionView.EmptyView>
     </CollectionView>
</RefreshView>
Run Code Online (Sandbox Code Playgroud)

值得庆幸的是,即使未启用 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>
Run Code Online (Sandbox Code Playgroud)

EmptyView 开箱即用,没有任何不必要的解决方法。我建议使用 BindableLayouts,直到 MAUI 解决 CollectionViews 周围的所有错误。

  • 令人遗憾的是 .Net Maui 团队花了 2 年时间来解决这个基本问题,它应该随 .Net 8 一起推出,但无论如何还是感谢您的解决方法 (2认同)