我正在结合 MAUI 的 Microsoft 文档,但遇到了一个我不明白的问题。
当
DataTemplate
具有类似 StackLayout
的布局时,它不会渲染,但一个简单的 Label
将在 UI 上渲染。
我在“运行时选择 EmptyViewTemplate”(https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/collectionview/emptyview?view=net-maui-8.0#choose -运行时的空视图模板)。
我有以下设置。
Xaml ContentPage、资源(DataTemplate 和 SearchTermDataTemplateSelector)以及 UI 控件:
...
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="BasicTemplate">
<StackLayout>
<Label
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="No items to display." />
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="AdvancedTemplate">
<StackLayout>
<Label
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="No results matched your filter." />
<Label
FontAttributes="Italic"
FontSize="12"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="Try a broader filter?" />
</StackLayout>
</DataTemplate>
<controls:SearchTermDataTemplateSelector
x:Key="SearchSelector"
DefaultTemplate="{StaticResource BasicTemplate}"
OtherTemplate="{StaticResource AdvancedTemplate}" />
</ContentPage.Resources>
...
<SearchBar
x:Name="searchBar"
Placeholder="Filter"
SearchCommandParameter="{Binding Text, Source={x:Reference searchBar}}">
</SearchBar>
<CollectionView
EmptyView="{Binding Source={x:Reference searchBar}, Path=Text}"
EmptyViewTemplate="{StaticResource SearchSelector}"
ItemTemplate="{StaticResource GenericTemplate}"
ItemsSource="{Binding Items}"
... />
模板选择器:
public class SearchTermDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultTemplate { get; set; }
public DataTemplate OtherTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
string query = (string)item;
return query.ToLower().Equals("test") ? OtherTemplate : DefaultTemplate;
}
使用上面的代码,
DataTemplate
不会显示在用户界面上,但是,如果我删除StackLayout
并仅提供单个Label
,它会正确渲染并显示Label
。 根据提供的 URL,我应该能够拥有更复杂的 DataTemplate,但它对我不起作用。
虽然不是完美的解决方案,但我可以通过将
HeightRequest
设置为一个值来使用布局显示 DataTemplate。
例如:
<DataTemplate x:Key="BasicTemplate">
<StackLayout HeightRequest="200"> <== HeightRequest Workaround
<Label
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="No items to display." />
</StackLayout>
</DataTemplate>
<DataTemplate x:Key="AdvancedTemplate">
<StackLayout HeightRequest="200"> <== HeightRequest Workaround
<Label
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="No results matched your filter." />
<Label
FontAttributes="Italic"
FontSize="12"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center"
Text="Try a broader filter?" />
</StackLayout>
</DataTemplate>