xamarin - tapgesturerecognizer - ¿Puedo usar el código C#para agregar una llamada a un comando en lugar de un<Grid.GestureRecognizers>?
xamarin forms tapgesturerecognizer xaml (1)
Tengo este código:
<ViewCell x:Name="co">
<Grid VerticalOptions="CenterAndExpand" Padding="20, 0">
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding OpenPickerCommand}" CommandParameter="{x:Reference coPicker}" NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
<Picker x:Name="coPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="coPickerSelectedIndexChanged" ItemsSource="{Binding Order}"></Picker>
<Label x:Name="coLabel" HorizontalOptions="End"/>
</Grid>
</ViewCell>
¿Hay alguna manera de que pueda conectar un comando en C # para tocar la celda en lugar de tener que usar XAML <Grid.GestureRecognizers>
?
Agregar un GestureRecognizer
a una ViewCell
es un gran no-no. Una ViewCell
existe dentro de un ListView o TableView que tienen más que suficientes opciones personalizadas. Agregar un GestureRecognizer
puede confundir el sistema operativo con respecto a qué toque debe manejar.
Sus opciones para GestureRecognizer
son básicamente las 3 siguientes, pero desaconsejo las mismas en un escenario en el que tenga ListView
/ TableView
.
Vea algunas de las alternativas basadas en ListView / ViewCell que menciono a continuación en su situación.
1. GestureRecognizer - Agréguelo en el código
var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
// handle the tap
};
myGrid.GestureRecognizers.Add(tapGestureRecognizer);
2. GestureRecognizer - Use un comando
Cuando usa MVVM también puede usar un enlace de comando en C #:
var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.SetBinding (TapGestureRecognizer.CommandProperty, "TapCommand");
myGrid.GestureRecognizers.Add(tapGestureRecognizer);
Que luego se puede enlazar en XAML:
<Grid>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapCommand}" />
</Grid.GestureRecognizers>
</Grid>
3. GestureRecognizer: agrégalo a XAML como lo has hecho
<Grid>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding OpenPickerCommand}" CommandParameter="{x:Reference coPicker}" NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
</Grid>
4. ViewCell: evento aprovechado
Para ViewCell
tienes un evento Tapped
:
<ViewCell Height="100" Tapped="OnTapped">
<ViewCell.View>
<StackLayout BackgroundColor="White" >
</StackLayout>
</ViewCell.View>
</ViewCell>
Que puedes implementar en código subyacente:
void OnTapped (object sender, System.EventArgs e) { //your code}
5. ViewCell - Comando Tapped
Al usar MVVM, no desea poner mucha lógica comercial en el código subyacente de sus páginas. En ese caso, puede usar un Behavior
para convertir el evento en un comando. Una muestra de eso se puede encontrar aquí:
6. ListView - ItemSelected
ListView
también tiene un evento ItemSelected
. Esto se puede manejar de la misma manera que el evento ViewCell
Tapped
con un evento en código subyacente o un Behavior
para delegarlo en un Command
.
7. ListView - propiedad SelectedItem
Puede vincular SelectedItem
a una propiedad en su modelo de vista. En el setter puede realizar su código personalizado.
<ListView
ItemsSource="{Binding YourItems}"
SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" >
</ListView>
Y en código:
string _yourSelectedItem;
public string YourSelectedItem
{
get { return _yourSelectedItem; }
set {
_yourSelectedItem = value;
// Perform your custom functionality
}
}