2015-07-31 4 views
0

У меня есть ListBox, который дублирует список комментариев веб-службы. Когда я запускаю приложение, комментарии отображаются отлично. Теперь я хочу использовать свойство объекта выбранного элемента ListBox и получить идентификатор, а затем назначить ему строковое значение. Когда я сейчас запускаю приложение и нажимаю на комментарий, чтобы выбрать его, я получаю исключение Null в визуальной студии. Затем я устанавливаю точку прерывания в строке кода и пытаюсь получить значение над мышью, он возвратил весь объект совершенно нормально, но все они были пустыми. фрагменты кода ниже:Объект выбранного объекта ListBox, возвращающий значение null

<ListBox x:Name="lbxComments" Margin="0,0,-12,0" 
       ItemsSource="{Binding CommentList,Mode=TwoWay}" 
       SelectionChanged="lbxComments_SelectionChanged" 
       > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="auto"/> 
          <ColumnDefinition Width="480"/> 

         </Grid.ColumnDefinitions> 

         <Grid.RowDefinitions> 
          <RowDefinition Height="auto"/> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <Image Stretch="UniformToFill" Height="50" Width="50" Source="{Binding profile_pic}" Margin="8" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
         <Border Grid.ColumnSpan="2" Grid.Row="0" HorizontalAlignment="Stretch" BorderBrush="Black" BorderThickness="0,0,0,0.5"/> 
         <StackPanel Grid.Column="1" > 
          <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="20" Text="{Binding comment}" TextWrapping="Wrap" TextTrimming="WordEllipsis" Foreground="White" /> 
          <StackPanel Orientation="Horizontal" Margin="0,0,0,5"> 
           <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="16" Text="{Binding fname}" Foreground="White"/> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="16" Text="{Binding lname}" Margin="10 0 0 0" Foreground="White"/> 

             <StackPanel Orientation="Horizontal"> 
              <TextBlock Text="Replies"/> 
              <TextBlock Text="("/> 
              <TextBlock Text="{Binding totalreplies}"/> 
              <TextBlock Text=")" /> 
             </StackPanel> 

           </StackPanel> 
          </StackPanel> 
         </StackPanel> 



         <TextBlock x:Name="replyTextBox" Grid.Row="2" Margin="50,0,0,0" Visibility="Collapsed" /> 

        </Grid> 

       </DataTemplate> 

      </ListBox.ItemTemplate> 
     </ListBox> 

и в коде позади:

private void lbxComments_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     string selectedCommentId; 
     Comment comment = ((sender as FrameworkElement).DataContext) as Comment; 
     comment = new Comment(); 
     if (comment.id != null) 
     { 
      selectedCommentId = comment.id; 
      repliesViewModel.SetAddress(selectedCommentId); 
     } 

... CommentList, что lbxComments связывается тип комментария

public class Comment 
{ 
    public string fname { get; set; } 
    public string lname { get; set; } 
    public string profile_pic { get; set; } 
    public string id { get; set; } 
    public string username { get; set; } 
    public string comment { get; set; } 
    public string totalreplies { get; set; } 
} 

так теперь я не знаю, почему он возвращает значение null, когда я пытаюсь получить выбранный объект объекта, но отображаю отлично, когда в поле списка

ответ

0

Есть 2 проблемы в вашем коде:

Проблема 1: Вы бросаете неправильный объект:

В этом случае; sender - ListBox, вы фактически набрасываете ListBox в объект Comment. Вот почему его бросает NullReferenceException.

Решение:

В основном вы должны бросить SelectedItems, которые доступны в SelectionChangedEventArgs например e. Он имеет свойство AddedItems, он содержит список выбранных элементов.

private void lbxComments_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    //get all selected items and cast them into 'Comment' 
    foreach (Comment comment in e.AddedItems) 
    {  
     string selectedCommentId; 
     if (comment.id != null) 
     { 
      selectedCommentId = comment.id; 
      repliesViewModel.SetAddress(selectedCommentId); 
     } 
    } 

Проблема 2: Вы повторно инициализирует comment:

Вы не должны повторно инициализировать его, он делает все null.

0
Comment comment = ((sender as FrameworkElement).DataContext) as Comment; 
comment = new Comment(); // <- reassignment here 

Вы правильно получаете комментарий первым, но сразу после этого вы назначить новый Comment к одной и той же переменной, так что теперь он имеет нулевое id.

+0

Я сделал это, потому что Visual Studio дал мне эту ошибку: исключение типа «System.NullReferenceException» Дополнительная информация: ссылка на объект не установлена ​​в экземпляр объекта. Советы по устранению неполадок: используйте новое ключевое слово для создания экземпляра объекта. что я должен был сделать? –

+0

Пожалуйста, ответьте, если вы знаете, что можно сделать @gabrielnegut –