带有布局(StackLayout)的DataTemplate不会渲染,但当只有一个Label时会渲染

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

我正在结合 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,但它对我不起作用。

maui datatemplate datatemplateselector emptydatatemplate
1个回答
0
投票

虽然不是完美的解决方案,但我可以通过将

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>
© www.soinside.com 2019 - 2024. All rights reserved.