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

问题描述 投票:0回答:2

我的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 都会在会话的剩余时间内显示其内容。如果我不这样做,它将永远保持空白。

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

谢谢你。亚历克斯.

maui collectionview
2个回答
4
投票

这可能对你的情况没有帮助,但我也在努力让 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 周围的所有错误。


0
投票

我找到了一个非常简单的解决方法。只需将 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>
© www.soinside.com 2019 - 2024. All rights reserved.