2012-02-18 86 views
1

我已经与下列项目模板LongListSelector:事件与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)); 
    } 

要更改我已订阅LongListSele的SelectionChanged事件的项目的详细信息构造函数。这按预期工作。

但是,如果我点击复选框 - 首先点击复选框的事件被激发,但我不知道哪个复选框被点击(属性longlistselector.SelectedItem是旧的),并且在SelectionChanged事件刚刚开始并尝试导航到详细信息页面,如果我打算这样做会发生。

如何将这些事件分开以避免触发两者?我怎样才能得到相应的数据项?

非常感谢...
亲切的问候,丹尼

回答

2

您不需要听SelectionChanged事件。在Click,CheckedUnchecked事件处理程序中,您可以获得一个项目:

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

在你AlarmActivationClicked(上的复选框事件处理程序),你就可以得到该项目的DataItem的在那点击列表。

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

我没有看到事件AlarmListSelectionChanged方法在调用AlarmActivationClicked方法后被调用。如果点击复选框,复选框会更改为选中状态,但不会更改列表框中的选择内容。