如何在xamarin表单中的可绑定布局的数据模板选择器中获取列表大小



我想根据可绑定布局的itemSource大小显示不同的数据模板。我尝试使用DataTemplateSelector,但无法访问父列表的大小。如何在DataTemplateSelector中获取大小。

<StackLayout
x:Name="dynamicStack"
BackgroundColor="White"
BindableLayout.ItemTemplateSelector="{StaticResource brandMultipleTemplate}"
BindableLayout.ItemsSource="{Binding CategoryBrand}"
HorizontalOptions="FillAndExpand"
Spacing="0"
VerticalOptions="FillAndExpand" />
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="SingleBrandTemplate" />
<DataTemplate x:Key="TwoBrandTemplate">
<AbsoluteLayout
Margin="5"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<ffi:CachedImage
AbsoluteLayout.LayoutBounds="0.5,0.5"
AbsoluteLayout.LayoutFlags="PositionProportional"
Source="{Binding BrandLogo}" />
</AbsoluteLayout>
</DataTemplate>
<selector:CategoryBrandTemplateSelector
x:Key="brandMultipleTemplate"
SingleBrand="{StaticResource SingleBrandTemplate}"
TwoBrand="{StaticResource TwoBrandTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
class CategoryBrandTemplateSelector : DataTemplateSelector
{
public DataTemplate SingleBrand { get; set; }
public DataTemplate TwoBrand { get; set; }
public DataTemplate FourBrand { get; set; }
public DataTemplate MultiPageBrand { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
var list = (List<CategoryBrand>)container.GetValue;
if(list.Count == 4)
{
return FourBrand;
} else if(list.Count == 2)
{
return TwoBrand;
} else if(list.Count > 4)
{
return MultiPageBrand;
} else
{
return SingleBrand;
}
}
}

在选择器中,系统抛出无法强制转换为List异常。

将Container类型转换为ListView,并从ListView获取CategoryBrandTemplateSelector中的ItemSource。

protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
{
var listView = container as ListView;
var list = listView?.ItemsSource as List<CategoryBrand>;
var count = list?.Count;
//....
}

DataTemplateSelector 的参考代码

最新更新