WinRT gridview Ajouter une tuile

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.

entrer la description de l'image ici

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 _canExecute; private readonly Action _execute; public event EventHandler CanExecuteChanged; public DelegateCommand(Action execute) : this(execute, null) { } public DelegateCommand(Action execute, Predicate canExecute) { _execute = execute; _canExecute = canExecute; } public override bool CanExecute(object parameter) { if (_canExecute == null) { return true; } return _canExecute(parameter); } public override void Execute(object parameter) { _execute(parameter); } public void RaiseCanExecuteChanged() { if( CanExecuteChanged != null ) { CanExecuteChanged(this, EventArgs.Empty); } } } 

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: