2017-06-08 1 views
0

Je souhaite gérer les événements de la cellule dans l'objet parent. Ceci est le XAML de l'objet parent:Comment passer un événement de ViewCell à l'objet parent, où ListView est placé

<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="App.Views.SomeView" 
      xmlns:customViews="clr-namespace:App.Views;assembly=App" 
      VerticalOptions="FillAndExpand"> 

    <ListView x:Name="MyList" 
      HasUnevenRows="True" 
      CachingStrategy="RecycleElement"> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
     <customViews:CustomListItem/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </ListView> 
</StackLayout> 

Comme vous pouvez le voir, j'ai une cellule personnalisée définie dans mon modèle de données. Les itselfs cellulaires ressemble à ceci:

<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="App.Views.CustomListItem"> 

    <Image x:Name="infoButton" Aspect="AspectFit" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand" /> 

</ViewCell> 

Dans le code behind ajouter un robinet à l'image de reconnaissance:

public partial class CustomListItem : ViewCell 
{ 
    private TapGestureRecognizer onIconTapppedRecognizer; 

    public CustomListItem() 
    { 
     InitializeComponent(); 

     // Make it tapable 
     this.onIconTapppedRecognizer = new TapGestureRecognizer(); 
     this.onIconTapppedRecognizer.Tapped += Icon_Tapped; 
     this.infoButton.GestureRecognizers.Add(this.onIconTapppedRecognizer); 
    } 

    private async void Icon_Tapped(object sender, EventArgs e) 
    { 
     await MainPage.Instance.Detail.Navigation.PushAsync(new MyNewPage(this.viewModel)); 
    } 
} 

Maintenant, je veux recevoir l'événement Icon_Tapped sur SomeView. This approach ne fonctionne pas, car la cellule est définie dans un objet distinct et non sur la même "page". Another approach nécessite de passer le modèle de vue dans le code via le constructeur, mais j'ai défini cela en XAML. De plus, j'ai un modèle pour chaque entrée dans la vue de la liste et pas un pour l'ensemble de la liste.

Comment puis-je recevoir l'événement de la cellule?

+0

Pourquoi ne pas simplement ajouter un événement à 'CustomListItem' et le manipuler dans' SomeView'? – icebat

+0

Est-ce que vous essayez spécifiquement d'éviter de revenir au ViewModel de 'SomeView'? Vous pouvez ajouter le GestureRecognizer dans le fichier XAML 'ListItem' et le lier à une commande dans le BindingContext du parent (c'est-à-dire la source de ListView, ou son ViewModel parent). – ctacke

+0

@icebat: Où devrais-je m'inscrire/désabonnement de cet événement? La cellule est initialisée dans le 'DataTemplate' en XAML. – testing

Répondre

0

Je ne savais pas que vous pouvez définir des événements personnalisés sur un objet:

SomeView XAML ressemble maintenant à ce

<customViews:CustomListItem ButtonClicked="SomeView_ButtonClicked"/> 

Le gestionnaire d'événements selon le code derrière le fichier de SomeView

private async void SomeView_ButtonClicked(object sender, CustomEventArgs e) 
{ 
    // do something 
} 

Sur mon ViewCellCustomListItem J'ai défini un gestionnaire d'événement public comme ceci

public event EventHandler<CustomEventArgs> ButtonClicked; 

et du gestionnaire d'événements de mon geste supplémentaire de reconnaissance, cet événement est invoqué:

private void Icon_Tapped(object sender, EventArgs e) 
{ 
    this.ButtonClicked?.Invoke(sender, new CustomEventArgs(this.model)); 
}