简体   繁体   English

无法在 Xamarin Forms 的 CarouselView 中显示来自 DataTemplateSelector 的 DataTemplate

[英]Unable to display DataTemplate from DataTemplateSelector in CarouselView in Xamarin Forms

I have a carouselview in my Xam.Forms project.我的 Xam.Forms 项目中有一个轮播视图。 I have also created 3 ContentViews (one for each DataTemplate).我还创建了 3 个 ContentViews(每个 DataTemplate 一个)。 My template selector class looks like this我的模板选择器 class 看起来像这样

public class DashboardTemplateSelector : DataTemplateSelector
{
    public DataTemplate QuickMessageTemplate { get; set; }
    public DataTemplate DataViewTemplate { get; set; }
    public DataTemplate LastUsedTemplate { get; set; }

    public DashboardTemplateSelector()
    {
        QuickMessageTemplate = new DataTemplate(typeof(QuickMessage));
        DataViewTemplate = new DataTemplate(typeof(DataView));
        LastUsedTemplate = new DataTemplate(typeof(LastusedView));
    }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        var cv = (Frame)item;
        DataTemplate rv = null;

        switch(cv.ClassId)
        {
            case "data":
                rv = DataViewTemplate;
                break;
            case "quick":
                rv= QuickMessageTemplate;
                break;
            case "last":
                rv = LastUsedTemplate;
                break;
        }
        return rv;
    }

Nothing out of the ordinary and I have the ClassId on each frame within the ContentView set to match the name in the switch.没有什么不寻常的,我在 ContentView 中的每个框架上都设置了 ClassId,以匹配开关中的名称。

When I build the app and run it, it looks fine but there is nothing in the CarouselView and a break point set in the OnSelectTemplate method (the first line) is never hit.当我构建应用程序并运行它时,它看起来很好,但 CarouselView 中没有任何内容,并且在 OnSelectTemplate 方法(第一行)中设置的断点永远不会被命中。

My XAML for the carouselview is this我的用于轮播视图的 XAML 是这个

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

<CarouselView Grid.Row="2" PeekAreaInsets="12" Margin="8" ItemTemplate="{StaticResource templateSelector}" HeightRequest="200" BackgroundColor="BlueViolet" />

The view shows (can see the background colour) but nothing in the view itself.视图显示(可以看到背景颜色),但视图本身没有任何内容。

I've only checked this on a physical android device and not on iOS, but I'm guessing the same retult.我只在物理 android 设备上而不是在 iOS 上检查过这个,但我猜同样的结果。 My guess is that I can't cast to a Frame for the object, but I'm not sure.我的猜测是我不能为 object 转换成框架,但我不确定。

To populate data, you have to set an ItemsSource via DataBinding or Code-Behind.要填充数据,您必须通过 DataBinding 或 Code-Behind 设置 ItemsSource。 Then your DataTemplateSelector will be hit with each item of the ItemsSource as object item.然后,您的 DataTemplateSelector 将被 ItemsSource 的每个项目作为 object 项目命中。 Please see the documentation here: https://docs.microsoft.com/fr-fr/xamarin/xamarin-forms/user-interface/carouselview/layout请在此处查看文档: https://docs.microsoft.com/fr-fr/xamarin/xamarin-forms/user-interface/carouselview/layout

<CarouselView Grid.Row="2" PeekAreaInsets="12" Margin="8" ItemsSource="{Binding ViewsViewModels} ItemTemplate="{StaticResource templateSelector}" HeightRequest="200" BackgroundColor="BlueViolet" />

The item in OnSelectTemplate is itemsource data. OnSelectTemplate中的 item 是 itemsource 数据。 Change the item to container and use CarouselView instead of Frame .将项目更改为容器并使用CarouselView而不是Frame Do not forget to set the ClassId of your CarouselView .不要忘记设置CarouselViewClassId

The whold project for your reference.整个项目供您参考。

Xaml: Xaml:

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


<CarouselView
    Grid.Row="2"
    Margin="8"
    ClassId="data"
    HeightRequest="200"
    ItemTemplate="{StaticResource templateSelector}"
    ItemsSource="{Binding infos}"
    PeekAreaInsets="12" />

Code behind:后面的代码:

public partial class MainPage : ContentPage
{
    public ObservableCollection<Info> infos { get; set; }
    public MainPage()
    {
        InitializeComponent();
        infos = new ObservableCollection<Info>()
        {
            new Info{ DataViewText="DataViewText1", LastusedViewText="LastusedViewText1", QuickMessageText="QuickMessageText1"},
            new Info{ DataViewText="DataViewText2", LastusedViewText="LastusedViewText2", QuickMessageText="QuickMessageText2"},
            new Info{ DataViewText="DataViewText3", LastusedViewText="LastusedViewText3", QuickMessageText="QuickMessageText3"},
            new Info{ DataViewText="DataViewText4", LastusedViewText="LastusedViewText4", QuickMessageText="QuickMessageText4"},
        };
        this.BindingContext = this;

    }
}
public class Info
{
    public string QuickMessageText { get; set; }
    public string DataViewText { get; set; }
    public string LastusedViewText { get; set; }
}

QuickMessage, DataView and LastusedView is a contentview with label which binding a text. QuickMessage、DataView 和 LastusedView 是一个带有 label 的内容视图,它绑定了一个文本。

QuickMessage:快讯:

<Label Text="{Binding QuickMessageText}" />

DataView:数据视图:

 <Label Text="{Binding DataViewText}" />

LastusedView:上次使用的视图:

  <Label Text="{Binding LastusedViewText}" />

DashboardTemplateSelector:仪表板模板选择器:

public class DashboardTemplateSelector : DataTemplateSelector
{
    public DataTemplate QuickMessageTemplate { get; set; }
    public DataTemplate DataViewTemplate { get; set; }
    public DataTemplate LastUsedTemplate { get; set; }

    public DashboardTemplateSelector()
    {
        QuickMessageTemplate = new DataTemplate(typeof(QuickMessage));
        DataViewTemplate = new DataTemplate(typeof(DataView));
        LastUsedTemplate = new DataTemplate(typeof(LastusedView));
    }

   
    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        var cv = (CarouselView)container;
        DataTemplate rv = null;

        switch (cv.ClassId)
        {
            case "data":
                rv = DataViewTemplate;
                break;
            case "quick":
                rv = QuickMessageTemplate;
                break;
            case "last":
                rv = LastUsedTemplate;
                break;
        }
        return rv;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM