CollectionView:未显示 EmptyView 内容
CollectionView: EmptyView content not shown
我在使用 listview 的页面显示中有一个错误,所以我开始从 listview 迁移到 collectionview,但是...
这是集合视图的 XAML 代码,我不知道为什么当 ItemSource 没有任何数据时,没有显示空视图。
<StackLayout Style="{StaticResource PageLayout}">
<StackLayout VerticalOptions="CenterAndExpand" IsVisible="{Binding LoadingIndicator}">
<ActivityIndicator IsRunning="True" VerticalOptions="Center" HorizontalOptions="Center"/>
</StackLayout>
<StackLayout VerticalOptions="FillAndExpand" IsVisible="{Binding ShowContent}">
<CollectionView ItemsSource="{Binding Items}" VerticalOptions="FillAndExpand" SelectionMode="Single" SelectionChanged="CollectionView_SelectionChanged" Style="{StaticResource CollectionViewChecklistDefault}">
<CollectionView.Header>
<StackLayout HeightRequest="5">
</StackLayout>
</CollectionView.Header>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid ColumnSpacing="0" RowSpacing="0" Margin="0" Padding="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="25" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="40" />
<RowDefinition Height="10" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="37*" />
<ColumnDefinition Width="33*" />
<ColumnDefinition Width="30*" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding APP_ID}" IsVisible="False"/>
<BoxView Grid.Row="0" Grid.Column="0" Grid.RowSpan="8" Grid.ColumnSpan="3" Style="{StaticResource ListBox}"/>
<Image Grid.Row="0" Grid.Column="0" Aspect="AspectFit" Style="{StaticResource ListImage}">
<Image.Source>
<FontImageSource Glyph="" FontFamily="FontAwesomeSolid" Color="#343a40"></FontImageSource>
</Image.Source>
</Image>
<Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding OBSERVATION_TYPE_NAME}" Style="{StaticResource ListLabelBold}"/>
<Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[DATE], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}:'}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding OBSERVATION_DATE, StringFormat=' \{0:dd MMM yyyy}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[COMPANY], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding COMPANY_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[WORKPLACE], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding WORKPLACE_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[SECTOR], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding SECTOR_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[FOLLOW_UP_DEPARTMENT], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding FOLLOW_DEPARTMENT_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[DESCRIPTION], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding OBSERVATION_DESCRIPTION, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="3" Text="{Binding Traductions[CLOSE_OBSERVATION], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}}" Style="{StaticResource ListValueGreenEnd}" />
<Image Grid.Row="7" Grid.Column="2" Aspect="AspectFit" Style="{StaticResource ListImageArrow}">
<Image.Source>
<FontImageSource Glyph="" FontFamily="FontAwesomeSolid" Color="#7ca04b"></FontImageSource>
</Image.Source>
</Image>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.EmptyView>
<StackLayout VerticalOptions="CenterAndExpand">
<Label Text="{Binding Traductions[THERE_ARE_NO_OBSERVATIONS], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}}" Style="{StaticResource ListNotItemsFound}"/>
<Label Text="TEST"/>
</StackLayout>
</CollectionView.EmptyView>
</CollectionView>
</StackLayout>
</StackLayout>
这是它在集合视图(空)中的显示方式。我在 TEST 上贴了一个额外的标签
这是必须的
我做了一些实验。出现此症状的唯一方法是 {Binding ShowContent}
未能 return True。
我相信问题不在于 CollectionView。它是周围 StackLayout 的可见性。
验证:
- 将
IsVisible="{Binding ShowContent}"
替换为IsVisible="True"
。
如果这导致 EmptyView 出现,请检查这些可能的原因:
绑定上下文。 (在评论中,您展示了看起来正确的代码。仔细检查。)
正确声明 ShowContent,通知 XAML 更改:
// Start "true", so InitializeComponent will begin with it there.
private bool _showContent = true;
public bool ShowContent {
get => _showContent;
set {
_showContent = value;
OnPropertyChanged();
}
}
- 如果您有设置
ShowContent
的代码,请确认您已将其设置为 true
。
您遇到的问题的根本原因在于 CollectionView.Header
的使用。但这不是你的错。这是CollectionView
的一个bug:使用Header
时没有出现EmptyView
。
它已经报告给 Xamarin.Forms 开发人员。您可以跟踪进度 here.
我在使用 listview 的页面显示中有一个错误,所以我开始从 listview 迁移到 collectionview,但是... 这是集合视图的 XAML 代码,我不知道为什么当 ItemSource 没有任何数据时,没有显示空视图。
<StackLayout Style="{StaticResource PageLayout}">
<StackLayout VerticalOptions="CenterAndExpand" IsVisible="{Binding LoadingIndicator}">
<ActivityIndicator IsRunning="True" VerticalOptions="Center" HorizontalOptions="Center"/>
</StackLayout>
<StackLayout VerticalOptions="FillAndExpand" IsVisible="{Binding ShowContent}">
<CollectionView ItemsSource="{Binding Items}" VerticalOptions="FillAndExpand" SelectionMode="Single" SelectionChanged="CollectionView_SelectionChanged" Style="{StaticResource CollectionViewChecklistDefault}">
<CollectionView.Header>
<StackLayout HeightRequest="5">
</StackLayout>
</CollectionView.Header>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid ColumnSpacing="0" RowSpacing="0" Margin="0" Padding="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="25" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="40" />
<RowDefinition Height="10" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="37*" />
<ColumnDefinition Width="33*" />
<ColumnDefinition Width="30*" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding APP_ID}" IsVisible="False"/>
<BoxView Grid.Row="0" Grid.Column="0" Grid.RowSpan="8" Grid.ColumnSpan="3" Style="{StaticResource ListBox}"/>
<Image Grid.Row="0" Grid.Column="0" Aspect="AspectFit" Style="{StaticResource ListImage}">
<Image.Source>
<FontImageSource Glyph="" FontFamily="FontAwesomeSolid" Color="#343a40"></FontImageSource>
</Image.Source>
</Image>
<Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding OBSERVATION_TYPE_NAME}" Style="{StaticResource ListLabelBold}"/>
<Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[DATE], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}:'}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding OBSERVATION_DATE, StringFormat=' \{0:dd MMM yyyy}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[COMPANY], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding COMPANY_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[WORKPLACE], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding WORKPLACE_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[SECTOR], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding SECTOR_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[FOLLOW_UP_DEPARTMENT], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding FOLLOW_DEPARTMENT_NAME, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource PreviewLabel}">
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding Traductions[DESCRIPTION], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}, StringFormat='\{0}: '}" FontAttributes="Bold" TextTransform="Uppercase" TextColor="DarkGray"/>
<Span Text="{Binding OBSERVATION_DESCRIPTION, StringFormat=' \{0}'}"/>
</FormattedString>
</Label.FormattedText>
</Label>
<Label Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="3" Text="{Binding Traductions[CLOSE_OBSERVATION], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}}" Style="{StaticResource ListValueGreenEnd}" />
<Image Grid.Row="7" Grid.Column="2" Aspect="AspectFit" Style="{StaticResource ListImageArrow}">
<Image.Source>
<FontImageSource Glyph="" FontFamily="FontAwesomeSolid" Color="#7ca04b"></FontImageSource>
</Image.Source>
</Image>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.EmptyView>
<StackLayout VerticalOptions="CenterAndExpand">
<Label Text="{Binding Traductions[THERE_ARE_NO_OBSERVATIONS], Source={RelativeSource AncestorType={x:Type viewModel:ObservationCloseListViewModel}}}" Style="{StaticResource ListNotItemsFound}"/>
<Label Text="TEST"/>
</StackLayout>
</CollectionView.EmptyView>
</CollectionView>
</StackLayout>
</StackLayout>
这是它在集合视图(空)中的显示方式。我在 TEST 上贴了一个额外的标签
这是必须的
我做了一些实验。出现此症状的唯一方法是 {Binding ShowContent}
未能 return True。
我相信问题不在于 CollectionView。它是周围 StackLayout 的可见性。
验证:
- 将
IsVisible="{Binding ShowContent}"
替换为IsVisible="True"
。
如果这导致 EmptyView 出现,请检查这些可能的原因:
绑定上下文。 (在评论中,您展示了看起来正确的代码。仔细检查。)
正确声明 ShowContent,通知 XAML 更改:
// Start "true", so InitializeComponent will begin with it there.
private bool _showContent = true;
public bool ShowContent {
get => _showContent;
set {
_showContent = value;
OnPropertyChanged();
}
}
- 如果您有设置
ShowContent
的代码,请确认您已将其设置为true
。
您遇到的问题的根本原因在于 CollectionView.Header
的使用。但这不是你的错。这是CollectionView
的一个bug:使用Header
时没有出现EmptyView
。
它已经报告给 Xamarin.Forms 开发人员。您可以跟踪进度 here.