[英]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
.不要忘记设置CarouselView
的ClassId
。
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.