2014-02-11 4 views
0

У меня есть LongListSelector, который привязан к ObservableCollection для некоторых элементов. Элементы имеют много разных свойств.Как получить нажатый элемент из LongListSelector? (WP8)

<LongListSelector Name="DraftControl" MouseLeftButtonDown="GoToEditDraft"> 
    <LongListSelector.ItemTemplate> 
     <DataTemplate> 
      ... 
     </DataTemplate> 
    <LongListSelector.ItemTemplate> 
    </LongListSelector> 

У этого есть обработчик события. Но он получает в качестве отправителя весь LongListSelector, а не определенный элемент. Как добавить обработчик событий для всех элементов?

Вот код обработчика по:

private void GoToEditDraft(object sender, MouseButtonEventArgs mouseButtonEventArgs) 
    { 
     var clickerdItem = (LongListSelector)sender; 
     MessageBox.Show(clickedItem.SelectedItem.ToString()); 
    } 

Так, пытаясь получить SelectedItem таким образом бросает NullReferenceException.

шаблон данных:

<DataTemplate> 
<Grid Margin="10" toolkit:TiltEffect.IsTiltEnabled="True"> 
    <Grid.Background> 
     <SolidColorBrush Color="LightGray" Opacity="0.8"/> 
    </Grid.Background> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="120"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition MaxHeight="100"/> 
     <RowDefinition MaxHeight="30"/> 
    </Grid.RowDefinitions> 
    <TextBlock TextWrapping="Wrap" FontSize="28" Foreground="{StaticResource CustomApplicationTextBrush}" Text="{Binding Title, Converter={StaticResource SanitizeString}}" Margin="10,10,10,0" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2"/> 
    <Image Source="/Images/no-image.png" Stretch="UniformToFill" MaxHeight="100" Margin="10,10,0,10" Grid.RowSpan="1" Grid.Column="0" Grid.Row="1" VerticalAlignment="Top"/> 
    <TextBlock TextWrapping="Wrap" FontSize="18" Foreground="{StaticResource CustomApplicationTextBrush}" TextTrimming="WordEllipsis" Text="{Binding Address, Converter={StaticResource SanitizeString}}" Margin="10,0,10,10" Grid.Column="1" Grid.Row="1" VerticalAlignment="Top"/> 
</Grid> 
</DataTemplate> 

Переплет:

 ObservableCollection<Item> draftItems = new ObservableCollection<Item>(); 
     var draftStorage = IsolatedStorageFile.GetUserStoreForApplication(); 
     IReadOnlyList<StorageFile> allDrafts = await draftFolder.GetFilesAsync(); 
     foreach (StorageFile file in allDrafts) 
     {     
      using (var stream = new IsolatedStorageFileStream("Drafts\\" + file.Name, FileMode.Open, draftStorage)) 
      { 
       var fileReader = new StreamReader(stream); 
       string jsonContents = fileReader.ReadLine(); 
       Item readedItem = JsonConvert.DeserializeObject<Item>(jsonContents); 

       draftItems.Add(readedItem); 
       fileReader.Close(); 
      } 
     } 
     DraftControl.ItemsSource = draftItems; 

ответ

2

Подписаться на LongListSelectors SelectionChangedEvent скорее

<LongListSelector Name="DraftControl" SelectionChanged="lls_SelectionChanged"> 
    <LongListSelector.ItemTemplate> 
     <DataTemplate> 
      ... 
     </DataTemplate> 
    <LongListSelector.ItemTemplate> 
    </LongListSelector> 

и получить деталь в код

+0

+1 Вы были на 3,4 секунды быстрее;) – Romasz

+0

^Вы имели в виду, что он «Pi» секунд быстрее? – Madushan

+0

Он выдает исключение: XamlParseException: Не удалось назначить свойство «Microsoft.Phone.Controls.LongListSelector.SelectionChanged – splash27

3

Попробуйте это.

private void DraftControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var myItem = ((Item)(sender as LongListSelector).SelectedItem); 
} 
Смежные вопросы