Xamarin.Forms DataTemplateSelector 在 iOS 上不起作用未调用构造函数

问题描述

我像这样膨胀数据模板选择器:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:MyDataTemplateSelector x:Key="templateSelector"></local:MyDataTemplateSelector>
    </ResourceDictionary>
</ContentPage.Resources>

            <Grid Grid.Row="0"   >

                <abstractions:CarouselViewControl VerticalOptions="Start"  x:Name="carouselview" ItemTemplate="{StaticResource templateSelector}" />

            </Grid>

代码如下:

    public MyDataTemplateSelector()
    {
        Layout1 = new DataTemplate(typeof(CV_CarouselView_ShowPics));
        Layout2 = new DataTemplate(typeof(CV_VideoPlayer));
    }

    protected override DataTemplate OnSelectTemplate(object item,BindableObject container)
    {
        FullAdType cell = (FullAdType)item;

        if(cell != null && cell.hasVideo )
        {

            return Layout2; // get video layout 

        }

        else
            return Layout1;

    }

但是这两个数据模板选择器构造函数都没有在 iOS 上调用,但在 Android 上,它工作得很好。

这里有什么问题?

谢谢

解决方法

我们经常在 xaml 、check here 中定义 DataTemplate

 <ContentPage.Resources>
        <DataTemplate x:Key="AmericanMonkeyTemplate">
            ...
        </DataTemplate>

        <DataTemplate x:Key="OtherMonkeyTemplate">
            ...
        </DataTemplate>

        <controls:MonkeyDataTemplateSelector x:Key="MonkeySelector"
                                             AmericanMonkey="{StaticResource AmericanMonkeyTemplate}"
                                             OtherMonkey="{StaticResource OtherMonkeyTemplate}" />
    </ContentPage.Resources>

    <CarouselView ItemsSource="{Binding Monkeys}"
                  ItemTemplate="{StaticResource MonkeySelector}" />

但是,如果您想在后面的代码中初始化 DataTemplate,则可以在数据模板选择器构造函数中创建它们。

public PersonDataTemplateSelector()
        {
            ValidTemplate = new DataTemplate(()=> {

                var grid = new Grid();

                var nameLabel = new Label { FontAttributes = FontAttributes.Bold };
                nameLabel.TextColor = Color.Green;
                nameLabel.SetBinding(Label.TextProperty,"Name");
                grid.Children.Add(nameLabel);

                return grid ;
            });

            InvalidTemplate = new DataTemplate(() => {

                var grid = new Grid();

                var nameLabel = new Label {  };
                nameLabel.TextColor = Color.Red;
                nameLabel.SetBinding(Label.TextProperty,"Name");
                grid.Children.Add(nameLabel);

                return grid ;
            });

        }