La gestion des événements avec LongListSelector et élément de la liste avec case à cocher
-
27-10-2019 - |
Question
J'ai un LongListSelector avec le modèle d'élément suivant:
<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>
Et utilisé comme suit:
<controls:PivotItem Header="ziele">
<toolkit:LongListSelector x:Name="alarmList" Background="Transparent" IsFlatList="True"
ItemTemplate="{StaticResource stopItemTemplate}" SelectionChanged="AlarmListSelectionChanged" />
</controls:PivotItem>
L'événement 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));
}
Pour les détails du changement d'un article que je me suis inscrit l'événement SelectionChanged du LongListSelector. Cela fonctionne comme prévu.
Mais si je tape sur la case à cocher - tout d'abord l'événement clicked de la case à cocher est tiré, mais je ne reconnais pas ce qui a cliqué case à cocher (la propriété longlistselector.SelectedItem est vieux) et juste après l'événement SelectionChanged a tiré et essayez d'accéder à la page de détail comme est-il si j'ai l'intention de le faire.
Comment puis-je les séparer à des événements pour éviter de tirer à la fois? Et comment puis-je obtenir l'élément de données correspondant?
Merci beaucoup ...
Cordialement, Danny
La solution
Vous n'avez pas besoin d'écouter événement SelectionChanged
. Dans Click
, Checked
ou gestionnaire d'événements Unchecked
vous pouvez obtenir un élément:
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));
}
Autres conseils
Dans votre (gestionnaire d'événements sur la case à cocher) AlarmActivationClicked vous serez en mesure d'obtenir le dataitem de l'élément dans la liste qui a été un clic.
private void AlarmActivationClicked(object sender, RoutedEventArgs e)
{
var dataItem = ((FrameworkElement)sender).DataContext;
}
Je ne vois pas l'événement méthode AlarmListSelectionChanged appelée après la méthode AlarmActivationClicked est appelée. Si vous cliquez sur la case à cocher, la case à cocher change de case est cochée, mais il ne marche pas changer la sélection dans la zone de liste.