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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top