微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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的异常。

解决方法

将容器类型转换为 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;
  //....
}

Reference code for DataTemplateSelector

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。