2017-08-23 1 views
0

Je suis nouveau sur Xamarin. J'ai une exigence où je dois implémenter un ListView ou dire tableView qui ont plusieurs différentes cellules de taille de type. Et je dois aussi ajouter un en-tête pour une section particulière de cellules, et certaines de mes cellules personnalisées ont un scroll horizontal. J'ai fait cette chose dans iOS UITableView natif auparavant, mais je ne sais pas comment cela se fait dans Xamarin cross platform, quelqu'un peut-il m'aider?Formes Xamarin (multiplate-forme): Plusieurs types de cellules dans ListView

+0

utilisez DataTemplateSelector dans listView ou utilisez tableView –

+0

@ColeXia savez-vous comment puis-je définir différentes hauteurs pour différents DataTemplateSelector? Et comment puis-je implémenter un DataTemplateSelector avec un défilement horizontal? –

+0

1. Définissez listView.HasUnevenRowsDifferent = true. et définissez le différent dataTemplate. 2. définir scrollview avec oritation horizontale à l'intérieur du dataTemplate –

Répondre

5

Vous recherchez DataTemplateSelector, qui est très bien documenté dans le Xamarin.Forms documentation officiel.

Les bases sont que vous créez votre propre DataTemplateSelector classe:

public class MyDataTemplateSelector : DataTemplateSelector 
{ 

} 

Dans cette classe vous substituez OnSelectTemplate:

protected override DataTemplate OnSelectTemplate(object item, BindableObject container) 
{ 
} 

En vérifiant le type de l'argument item, vous devriez être en mesure de comprendre quel modèle retourner.

permet donc dire que vous avez un ViewModel pour Dog et un pour Cat et que vous voulez montrer un DataTemplate différent pour chacun de ceux-ci. Vous feriez quelque chose comme:

public class DogCatTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DogTemplate { get; set; } 
    public DataTemplate CatTemplate { get; set; } 

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container) 
    { 
     if (item is DogViewModel) 
      return DogTemplate; 
     return CatTemplate; 
    } 
} 

Ensuite, vous pouvez consommer dans votre XAML:

<ContentPage.Resources> 
    <ResourceDictionary> 
     <DataTemplate x:Key="dogTemplate"> 
      <ViewCell> 
       ... <---- define your look of dog template here 
      </ViewCell> 
     </DataTemplate> 
     <DataTemplate x:Key="catTemplate"> 
      <ViewCell> 
       ... <---- define your look of cat template here 
      </ViewCell> 
     </DataTemplate> 
     <local:DogCatTemplateSelector x:Key="dogCatTemplateSelector" 
      DogTemplate="{StaticResource dogTemplate}" 
      CatTemplate="{StaticResource catTemplate}" /> 
    </ResourceDictionary> 
</ContentPage.Resources> 

Ensuite, il suffit de la mettre ItemTemplate à votre dogCatTemplateSelector exemple, vous avez défini les ressources sur votre ListView:

<ListView ItemsSource="{Binding DogsCatsCollection}" ItemTemplate="{StaticResource dogCatTemplateSelector}" /> 

Votre ViewModel serait alors ressembler à:

public class Animal : INotifyPropertyChanged 
{ 
} 

public class DogViewModel : Animal 
{ 
} 

public class CatViewModel : Animal 
{ 
} 

public class MainViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<Animal> DogsCatsCollection { get; } 
     = new ObservableCollection<Animal>(); 
} 

Puis vous venez de renseigner DogsCatsCollection avec des instances de chiens et de chats.

+0

Merci pour la réponse. J'ai mis en place la même chose, ça fonctionne bien. Mais comment puis-je avoir une hauteur différente pour dogTemplate et catTemplate? Et comment puis-je ajouter un autre modèle avec un rouleau horizontal dedans? –

+0

@VivekShah ListView possède une propriété appelée HasUnevenRows. Si vous définissez cette valeur sur true, le moteur de rendu calculera automatiquement la hauteur si chaque ligne et donc vos modèles de chien et de chat peuvent avoir des hauteurs différentes. –

+0

@JacobJoz Merci, je l'ai implémenté. Ça fonctionne bien. Et pour le défilement horizontal, j'ai pris le ViewView Inside ViewCell et ça marche aussi bien. –