2014-09-22 9 views
13

Ho un ViewCell personalizzato con un pulsante. Quando clicco su questo pulsante mi piacerebbe gestire questo clic nella pagina di contenuto che visualizza il ListView con ViewCells. In iOS, lo farei con un delegato della cella. Come lo farei in C#/Xamarin.Forms?Pulsante Xamarin.Forms in ViewCell. Come gestire l'evento?

Questa è mia abitudine ViewCell:

public CustomCell() 
    { 
     button = new Button(); 

     button.Text = "Add"; 
     button.VerticalOptions = LayoutOptions.Center; 

     button.Clicked += [WHAT DO DO HERE???]; 

     var nameLabel = new Label(); 
     nameLabel.SetBinding (Label.TextProperty, "name"); 
     nameLabel.HorizontalOptions = LayoutOptions.FillAndExpand; 
     nameLabel.VerticalOptions = LayoutOptions.Center; 

     var viewLayout = new StackLayout() { 
      Padding = new Thickness (10, 0, 10, 0), 
      Orientation = StackOrientation.Horizontal, 
      Children = { nameLabel, button } 
     }; 

     View = viewLayout; 
    } 

E il mio ContentPage che sta usando questo come un ViewCell assomiglia a questo:

ListView.ItemTemplate = new DataTemplate (typeof(CustomCell)); 

Allora, come faccio a prendere il pulsante di stampa?

Si prega di chiedere se avete bisogno di chiarimenti.


Ok, quindi ho ottenuto questo fino atleast:

Questo è il mio ContentPage:

... 
    ListView.ItemTemplate = new DataTemplate (() => new CustomCell (CustomCellButtonClicked)); 
} 

void CustomCellButtonClicked (CustomCell m, EventArgs e) 
{ 
    //How do I get my associated object here?! 

    System.Diagnostics.Debug.WriteLine ("Pressed cell " + m.ToString()); 
} 

E questo è il mio cellulare:

public EventArgs e = null; 
    public event ButtonClickEvent ClickListener; 
    public delegate void ButtonClickEvent (AddCardCell m, EventArgs e); 

    public CustomCell (ButtonClickEvent Listener) 
    { 
     ClickListener += Listener; 
     customButton = new Button(); 

     customButton.Text = "Add"; 
     customButton.VerticalOptions = LayoutOptions.Center; 

     customButton.Clicked += AddButtonClicked; 

     ... 
    } 

    void AddButtonClicked (object sender, EventArgs e) 
    { 
     if (ClickListener != null) { 
      ClickListener (this, e); 
     } 
    } 

Quindi, tutto ciò che è lasciato ora serve per ottenere l'oggetto reale associato alla cella. In ItemSelected per ListView, è fatto così:

ListView.ItemSelected += async (object sender, SelectedItemChangedEventArgs e) => { 
      var obj = (HSObject)e.SelectedItem; 
     }; 

Come posso fare qualcosa di simile?


Trovato! Questo forse non è una buona soluzione, ma sembra funzionare:

void CustomCellButtonClicked (CustomCell m, EventArgs e) 
{ 
    var myObject = m.BindingContext; 
} 

Accetterò l'unica risposta a causa del fatto che mi ha spinto nella direzione giusta. (E che probabilmente è un modo migliore per farlo).

+0

Sto cercando una soluzione anche a questo, e guardandomi attorno sembra che non sia possibile. L'oggetto della cella di base non ha accesso all'oggetto della pagina, quindi non ha accesso ad alcuni eventi come il foglio di azione e la navigazione. Che evento stai cercando di gestire? – jcc

risposta

20

Se si utilizza un modello di visualizzazione o un'altra classe, è possibile passarla nella cella e effettuare le chiamate da lì. Anche la vista elenco sovrascrive i pulsanti sulla tua cella con l'evento ItemSelected dalla visualizzazione elenco. Fortunatamente hanno inserito un override nel modello di dati.

private readonly ViewModel _model; 
public CustomCell (ViewModel model) 
{ 
    _model = model; <--- Your DI foo 
    BindingContext = model; <--- 

    button = new Button(); 

    button.Text = "Add"; 
    button.VerticalOptions = LayoutOptions.Center; 

    button.Clicked += (sender, args) => _model.DoSomething(); <---- Your action 

    var nameLabel = new Label(); 
    nameLabel.SetBinding (Label.TextProperty, "name"); 
    nameLabel.HorizontalOptions = LayoutOptions.FillAndExpand; 
    nameLabel.VerticalOptions = LayoutOptions.Center; 

    var viewLayout = new StackLayout() { 
     Padding = new Thickness (10, 0, 10, 0), 
     Orientation = StackOrientation.Horizontal, 
     Children = { nameLabel, button } 
    }; 

    View = viewLayout; 
} 

Quindi è possibile passare il modello classe/vista nella cella con una funzione anonima.

ListView.ItemTemplate = new DataTemplate (() => new CustomCell(viewModel)); 

In questo modo è possibile attivare l'evento dalla cella della vista e gestirlo da un'altra parte (visualizza modello).

+1

Grazie! La tua ultima riga di codice mi ha spinto nella giusta direzione. Puoi controllare la mia risposta aggiornata e vedere se puoi aiutarmi con il mio ultimo problema? Grazie. – ullstrm

+0

Ora accetta la tua risposta anche se non la sto usando. – ullstrm

Problemi correlati