c# - lista - tableview xamarin forms
Botón Xamarin.Forms en ViewCell. ¿Cómo manejar el evento? (1)
Si está usando un modelo de vista o alguna otra clase, puede pasarlo a su celda y realizar llamadas desde allí. La vista de lista también anula actualmente los botones en su celda con el evento ItemSelected de la vista de lista. Afortunadamente, ponen una anulación en la plantilla de datos.
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;
}
Luego puede pasar su modelo de clase / vista a su celda con una función anónima.
ListView.ItemTemplate = new DataTemplate (() => new CustomCell(viewModel));
De esta forma, puede activar su evento desde la celda de visualización y manejarlo en otro lugar (ver modelo).
Tengo una ViewCell personalizada con un botón. Cuando hago clic en este botón me gustaría manejar este clic en la página de contenido que muestra el ListView con las ViewCells. En iOS, haría esto con un delegado de la Celda. ¿Cómo haría esto en C # / Xamarin.Forms?
Esta es mi ViewCell personalizada:
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;
}
Y mi ContentPage que está usando esto como una ViewCell se ve así:
ListView.ItemTemplate = new DataTemplate (typeof(CustomCell));
Entonces, ¿cómo atrapo el botón presionar?
Por favor, pregunte si necesita una aclaración.
Bien, entonces lo entendí al menos:
Esta es mi página de contenido:
...
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 ());
}
Y esta es mi celda:
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);
}
}
Entonces, todo lo que queda ahora es obtener el objeto real asociado con la celda. En ItemSelected para ListView, se hace así:
ListView.ItemSelected += async (object sender, SelectedItemChangedEventArgs e) => {
var obj = (HSObject)e.SelectedItem;
};
¿Cómo puedo hacer algo como esto?
¡Lo tengo! Esta quizás no sea una buena solución, pero parece funcionar:
void CustomCellButtonClicked (CustomCell m, EventArgs e)
{
var myObject = m.BindingContext;
}
Aceptaré la única respuesta debido al hecho de que me empujó en la dirección correcta. (Y que es probablemente una mejor manera de hacer esto).