问题描述
我像这样膨胀数据模板选择器:
<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 ;
});
}