Manejo de eventos con LongListSelector y elemento de lista con casilla de verificación
-
27-10-2019 - |
Pregunta
Tengo un LongListSelector con la siguiente plantilla de elemento:
<DataTemplate x:Key="stopItemTemplate">
<Grid Margin="{StaticResource PhoneTouchTargetOverhang}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<CheckBox VerticalAlignment="Top" HorizontalAlignment="Left" IsChecked="{Binding Checked}" Click="AlarmActivationClicked" />
<StackPanel Grid.Column="1" VerticalAlignment="Top">
<TextBlock Text="{Binding Stop.Name}" Style="{StaticResource PhoneTextLargeStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" TextWrapping="Wrap" Margin="12,-12,12,6"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Distanz:" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" Width="120"/>
<TextBlock Text="{Binding Distance, Converter={StaticResource MyStringFormatConverter}, ConverterParameter=:1000:\{0:0.0\} km}" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Alarm:" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" Width="120"/>
<TextBlock Text="{Binding Alarm, Converter={StaticResource MyBooleanStringConverter}}" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Vibration:" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" Width="120"/>
<TextBlock Text="{Binding Vibration, Converter={StaticResource MyBooleanStringConverter}}" Style="{StaticResource PhoneTextSmallStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}"/>
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
Y usado como siguió:
<controls:PivotItem Header="ziele">
<toolkit:LongListSelector x:Name="alarmList" Background="Transparent" IsFlatList="True"
ItemTemplate="{StaticResource stopItemTemplate}" SelectionChanged="AlarmListSelectionChanged" />
</controls:PivotItem>
El evento SelectionChanged:
private void AlarmListSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var guid = ((AlarmItem)alarmList.SelectedItem).Id;
NavigationService.Navigate(new Uri(string.Concat("/AlarmDetailPage.xaml?id=", guid), UriKind.Relative));
}
Para cambiar los detalles de un elemento, he suscrito el evento SelectionChanged del LongListSelector. Eso funciona como se esperaba.
Pero si toco la casilla de verificación: al principio se dispara el evento de verificación que se hace clic de la casilla de verificación, pero no reconozco en qué casilla de verificación se hizo clic (la propiedad LongListSelector.SelectedItem es antigua) y justo después de que el evento SelectionChanged haya disparado e intente navegar por navegar a la página de detalles como si sucede si tengo la intención de hacer eso.
¿Cómo puedo separar estos a los eventos para evitar disparar ambos? ¿Y cómo puedo obtener el elemento de datos correspondiente?
Muchas gracias...
Saludos cordiales, Danny
Solución
No necesitas escuchar SelectionChanged
evento. En Click
, Checked
o Unchecked
Manejador de eventos puede obtener un artículo:
private void CheckBox_Checked(object sender, System.Windows.RoutedEventArgs e)
{
var guid = ((sender as CheckBox).DataContext as AlarmItem).Id;
NavigationService.Navigate(new Uri(string.Concat("/AlarmDetailPage.xaml?id=", guid), UriKind.Relative));
}
Otros consejos
En su AlarmActivationClicked (controlador de eventos en la casilla de verificación) podrá obtener el DataItem del elemento en la lista que fue clic.
private void AlarmActivationClicked(object sender, RoutedEventArgs e)
{
var dataItem = ((FrameworkElement)sender).DataContext;
}
No estoy viendo que el método de Event AlarmListSelectionChanged se llame después de que se llame al método de AlarmActivationClicked. Si hace clic en la casilla de verificación, la casilla de verificación cambia a verificada, pero no cambia la selección en el cuadro de lista.