Обработка событий с помощью LongListSelector и элемента списка с флажком - PullRequest
1 голос
/ 18 февраля 2012

У меня есть LongListSelector со следующим шаблоном элемента:

    <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>

И используется следующим образом:

<controls:PivotItem Header="ziele">
    <toolkit:LongListSelector x:Name="alarmList" Background="Transparent" IsFlatList="True"
        ItemTemplate="{StaticResource stopItemTemplate}" SelectionChanged="AlarmListSelectionChanged" />
</controls:PivotItem>

Событие 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));
    }

Чтобы изменить детали элемента, я подписался на событие SelectionChanged LongListSelector.Это работает, как и ожидалось.

Но если я нажму на флажок - сначала срабатывает событие clicked этого флажка, но я не узнаю, какой флажок был нажат (свойство longlistselector.SelectedItem старое) исразу после того, как событие SelectionChanged сработало, и попробуйте перейти на страницу сведений, как это происходит, если я собираюсь это сделать.

Как можно разделить их на события, чтобы избежать срабатывания обоих?И как я могу получить соответствующий элемент данных?

Большое спасибо ...
С уважением, Дэнни

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Вам не нужно слушать SelectionChanged событие.В обработчике событий Click, Checked или Unchecked вы можете получить элемент:

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));
}
1 голос
/ 20 февраля 2012

В вашем AlarmActivationClicked (обработчик события на флажке) вы сможете получить данные элемента в списке, который был клик.

    private void AlarmActivationClicked(object sender, RoutedEventArgs e)
    {
        var dataItem = ((FrameworkElement)sender).DataContext;
    }

Я не вижу, чтобы метод AlarmListSelectionChanged вызывался после вызова метода AlarmActivationClicked. Если вы установите флажок, флажок изменится на флажок, но он не изменит выбор в списке.

...