J’ai un GridView et il est lié à la List des éléments. Je veux qu’il ait un élément statique pour que les utilisateurs puissent cliquer dessus pour append d’autres éléments. Si je clique sur d’autres articles, je produis une page de détails sur les articles.
Comment puis-je avoir cette tuile statique qui a un comportement entièrement différent de tous les autres éléments de grid de GridView ? Comme la dernière tuile dans l’image ci-dessous.
Dans nos projets, nous avons trouvé une solution propre pour ce faire: Votre GridView ItemsSource est lié à une collection de ViewModels. Le dernier peut être une VM bien connue, par exemple une instance LoadMoreViewModel .
Il vous permet de créer une implémentation DataTemplateSelector et de la définir sur la propriété ItemTemplateSelector du GridView.
public class LoadMoreTemplateSelector: DataTemplateSelector { public DataTemplate LoadMoreTemplate { get; set; } public DataTemplate DefaultTemplate { get; set; } protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) { if (item is LoadMoreViewModel) { return LoadMoreTemplate; } else { return DefaultTemplate; } } }
Créez une instance de ce TemplateSelector en tant que ressource dans votre fichier xaml et définissez les modèles appropriés:
Votre gridView peut utiliser ce sélecteur de modèle
Le LoadMoreTemplate devrait ressembler à ceci:
Le seul problème restant étant que vous devrez implémenter une commande ICommand dans votre LoadMoreViewModel pour lier le bouton load more dans le modèle, ou créer un UserControl pour pouvoir réagir à l’événement Click.
EDIT: Voici une implémentation simple de ICommand. Il exécutera l’action transmise au constructeur lorsque le bouton est cliqué.
public class DelegateCommand : ICommand { private readonly Predicate
Lorsque vous instanciez votre LoadMoreViewModel, vous pouvez fournir l’action à exécuter lorsque l’utilisateur clique sur le bouton Charger plus.
public class LoadMoreViewModel:BindableBase { public ICommand LoadMore{get;private set;} public LoadMoreViewModel(Action action) { LoadMore = new DelegateCommand(action); } }
Et dans la page ViewModel, lors du chargement de plusieurs éléments de la liste, supprimez le LoadMoreViewModel en cours à la fin de la liste, puis ajoutez des éléments supplémentaires, puis ajoutez à nouveau le LoadMoreViewModel (si nécessaire):
public void LoadMoreItems() { if(Items.Last() is LoadMoreViewModel) { Items.Remove(Items.Last()); } //Insert here add new items logic. Items.Add(new LoadMoreViewModel(_=>LoadMoreItems()); }
Vous pouvez simplement modifier le modèle de contrôle de GridView: