首页 > 解决方案 > 我可以将特定样式应用于 Xamarin 中 ObservableCollection 的第一项吗?

问题描述

我想知道是否有办法将特定样式应用于ObservableCollectionXamarin 中的第一个元素。我想对其进行自定义,以便它以比其他方式呈现的特定方式。到目前为止,我已经做了很多研究,但我找不到任何可以帮助我的东西。真的有可能做这样的事情吗?我的问题没有提供代码,因为我仍然要开始我想到的项目。

标签: c#wpfxamlxamarinobservablecollection

解决方案


正如 Jason 的回复,您可以使用DataTemplateSelector来执行此操作,您需要一个属性来区分第一项与其他项。

我做了一个样本,你可以看看:

创建一个 DataTemplateSelector:

public class itemDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate firsttemplate { get; set; }
    public DataTemplate secondtemplate { get; set; }
    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if(((itemdata)item).isfirst==true)
        {
            return firsttemplate;
        }
        return secondtemplate;
       
    }
}

在 XAML 中使用 DataTemplateSelector

  <ContentPage.Resources>
    <DataTemplate x:Key="firstitemTemplate">
        <StackLayout Orientation="Horizontal">
            <Label
                FontSize="Large"
                Text="{Binding name}"
                TextColor="Green" />
            <Label
                FontSize="Large"
                Text="{Binding age}"
                TextColor="Green" />
        </StackLayout>
    </DataTemplate>
    <DataTemplate x:Key="seconditemTemplate">
        <StackLayout Orientation="Horizontal">
            <Label Text="{Binding name}" TextColor="Red" />
            <Label Text="{Binding age}" TextColor="Red" />
        </StackLayout>
    </DataTemplate>
    <selector:itemDataTemplateSelector
        x:Key="itemdatatemplateselector"
        firsttemplate="{StaticResource firstitemTemplate}"
        secondtemplate="{StaticResource seconditemTemplate}" />
</ContentPage.Resources>

申请Collectionview

<ContentPage.Content>
    <StackLayout>
        <CollectionView ItemTemplate="{StaticResource itemdatatemplateselector}" ItemsSource="{Binding items}" />
    </StackLayout>
</ContentPage.Content>

我使用 isfirst Boolen 属性将第一项与其他项区分开来。

 public partial class Page14 : ContentPage
{
    public ObservableCollection<itemdata> items { get; set; }
    public Page14()
    {
        InitializeComponent();
        items = new ObservableCollection<itemdata>()
        {
            new itemdata(){name="cherry",age=28,isfirst=true },
            new itemdata(){name="cherry 1",age=28,isfirst=false },
            new itemdata(){name="cherry 2",age=28,isfirst=false },
            new itemdata(){name="cherry 3",age=28,isfirst=false },
            new itemdata(){name="cherry 4",age=28,isfirst=false }
        };
        this.BindingContext = this;
    }
}

public class itemdata
{
    public string name { get; set; }
    public int age { get; set; }

    public Boolean isfirst { get; set; }
}

推荐阅读