2016-03-22 6 views
0

Ich brauche etwas Hilfe bei der Weitergabe der ListView Tapped Id (die ich von einem JSON bekomme).Weitergabe von JSON-Objektdaten aus einem ListView SelectedItem

ich bevölkern Listenansicht mit einem API-Aufruf an einen Server:

 private async void searchButton_Click(object sender, RoutedEventArgs e) 
    { 
     var textFrom = odTextBox.Text; 
     var textTo = doTextBox.Text; 
     var searchResult = await PrevoziApi.SearchRidesAsync(textFrom, textTo, datePicker.Date.UtcDateTime); 
     var array = searchResult.CarshareList 
       .OrderBy(cs => cs.Time) 
       .Select(cs => cs.Contact + " " + cs.Time) 
       .ToArray(); 
      listView.ItemsSource = array; 
    } 

Nun, wenn ich auf einen Artikel von Listview klicken, möchte ich auf eine andere Seite (CarShareDetailedPage) und machen einen weiteren Anruf zu der navigieren API, um detailliertere Daten zu diesem Objekt zu erhalten. Also muss ich die selectedItem ID von einer Seite an andere weitergeben. Wie mache ich das ?

ich auf eine andere Seite wie diese Navigation:

 private void listView_Tapped(object sender, TappedRoutedEventArgs e) 
    { 
     Frame.Navigate(typeof(CarShareDetailedPage), listView.SelectedIndex); 
    } 

Die OnNagiatedMethod auf dieser Seite lautet:

 protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     var value = e.ToString(); 
     carShareTextBox.Text = value; 
    } 

Und meine Json-Klasse ist:

public class CarshareList 
    { 
     [JsonProperty("id")] 
     public int Id { get; set; } 
     [JsonProperty("type")] 
     public string Type { get; set; } 
     [JsonProperty("from_id")] 
     public string FromId { get; set; } 
     [JsonProperty("from_country")] 
     public string FromCountry { get; set; } 
     [JsonProperty("from_country_name")] 
     public string FromCountryName { get; set; } 
     [JsonProperty("to_id")] 
     public string ToId { get; set; } 
     [JsonProperty("to")] 
     public string To { get; set; } 
     [JsonProperty("to_country")] 
     public string ToCountry { get; set; } 
     [JsonProperty("to_country_name")] 
     public string ToCountryName { get; set; } 
     [JsonProperty("time")] 
     public string Time { get; set; } 
     [JsonProperty("date_iso8601")] 
     public DateTime DateIso8601 { get; set; } 
     [JsonProperty("added")] 
     public DateTime Added { get; set; } 
     [JsonProperty("price")] 
     public double? Price { get; set; } 
     [JsonProperty("num_people")] 
     public double NumPeople { get; set; } 
     [JsonProperty("author")] 
     public string Author { get; set; } 
     [JsonProperty("is_author")] 
     public string IsAuthor { get; set; } 
     [JsonProperty("comment")] 
     public string Comment { get; set; } 
     [JsonProperty("contact")] 
     public string Contact { get; set; } 
     [JsonProperty("date")] 
     public string Date { get; set; } 
     [JsonProperty("full")] 
     public string Full { get; set; } 
     [JsonProperty("insured")] 
     public string Insured { get; set; } 
     [JsonProperty("share_type")] 
     public string ShareType { get; set; } 
     [JsonProperty("confirmed_contact")] 
     public string ConfirmedContact { get; set; } 
     [JsonProperty("bookmark")] 
     public object Bookmark { get; set; } 
     [JsonProperty("from")] 
     public string From { get; set; } 
    } 

    public class CarshareResponse 
    { 
     [JsonProperty("search_type")] 
     public string SearchType { get; set; } 
     [JsonProperty("carshare_list")] 
     public IList<CarshareList> CarshareList { get; set; } 
    } 

Lassen Sie mich Sag, das ist das erste Mal überhaupt, dass ich mit Apis und Json arbeite. Danke für Ihre Hilfe!

EDIT: Ich habe den Code für die API unten hinzugefügt, so dass dies jetzt der gesamte Code sein sollte, den ich habe.

public class PrevoziApi 
{ public static async Task<CarshareResponse> SearchRidesAsync(
    string fromCity, 
    string toCity, 
    DateTime date, 
    string type = "shares", 
    CancellationToken token = default(CancellationToken)) 
    { 
     using (var client = new RestClient("https://prevoz.org/api/")) 
     { 
       var request = new RestRequest("search/" + type + "/", HttpMethod.Get); 
       request.AddQueryParameter("f", fromCity); 
       request.AddQueryParameter("fc", "SI"); 
       request.AddQueryParameter("t", toCity); 
       request.AddQueryParameter("tc", "SI"); 
       request.AddQueryParameter("d", date.ToString("yyyy-MM-dd")); 
       request.AddQueryParameter("exact", "true"); 
       return 
        (await client.Execute<CarshareResponse>(request, token)).Data; 
      } 
    } 
} 

Antwort

1

Dies funktioniert:

 private async void searchButton_Click(object sender, RoutedEventArgs e) 
    { 
     var textFrom = odTextBox.Text; 
     var textTo = doTextBox.Text; 
     var searchResult = await PrevoziApi.SearchRidesAsync(textFrom, textTo, datePicker.Date.UtcDateTime); 

     List<CarItemView> array = searchResult.CarshareList 
            .OrderBy(cs => cs.Time) 
            .Select(cs => new CarItemView { DisplayText = cs.Contact + " " + cs.Time, Id = cs.Id }) 
            .ToList(); 
     listView.ItemsSource = array; 
    } 

     private void listView_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) 
    { 
     var obj = (CarItemView)listView.SelectedItem; // convert item to our new class 
     Frame.Navigate(typeof(CarShareDetailedPage), obj.Id); // send ID as string   
    } 

Und auf der Methode auf der Zielseite navigiert:

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     var value = e.Parameter.ToString(); 
     carShareTextBox.Text = value; // will show the ID number 

     /* write a new restful function to return based on ID */ 
    } 

Dank @ Daniel, war es vor allem, wie Sie vorgeschlagen, mit ein paar Fehler, aber mit der Hilfe von ein paar Jungs im C# Chat-Kanal, den ich geschafft habe. Dank an alle.

1

Also mit dieser, Sie bestellen zu der Zeit, aber Anzeige einer Zeichenfolge nur, die sagt "[Kontakt] [Zeit]". Dieses an und für sich hat keine Beziehung zu dem JSON, das von Ihrer Suchmethode zurückgegeben wurde. Was Sie tun möchten, ist, anstatt es zu einem Array zu machen, anstatt ein List <> -Objekt zu erstellen, das einige zusätzliche "Hintergrund" -Daten über diese Anfrage speichern kann.

Dies erfordert jedoch ein wenig mehr Aufwand an Ihrem Ende. Sie wollen eine Klasse

erstellen und sie mit den Daten füllen, die Sie weitergeben möchten. Dann in Ihren Filter würden Sie tun:

List<CarItemView> array = searchResult.CarshareList 
      .OrderBy(cs => cs.Time) 
      .Select(cs => new { DisplayText = cs.Contact + " " + cs.Time, ID = cs.Id}).ToList(); 

Sie werden dann in XAML, haben eine Vorlage auf Ihre Listenansicht zur Anzeige hinzuzufügen. (Beachten Sie, ist dies eine echte grobe Skizze für eine XAML-Vorlage)

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding DisplayText}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

JETZT, wenn Sie Ihr ausgewähltes Element geändert Ereignis ausgelöst, können Sie damit umgehen und die ID bekommen.

private void listView_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    var obj = (CarItemView) listView.SelectedItem; // convert item to our new class 
    Frame.Navigate(typeof(CarShareDetailedPage), obj.Id.ToString()); // send ID as string 
} 

dann für die Empfangsseite:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    var value = e.ToString(); 
    carShareTextBox.Text = value; // will show the ID number 

    var caritemret = /* write a new restful function to return based on ID */ 
} 

UPDATE: Diese Antwort von Original wurde aktualisiert < die Verwendung eines Arrays statt einer Liste zu reflektieren> Objekt

Ich hoffe, das hilft !

+0

Wie Sie gesagt haben, ID ist einzigartig für jedes Element in der CarshareList, und mit dieser ID kann ich mehr Daten ohne ein Problem ziehen. Ich habe listView.SelectedIndex nur als Beispiel, ich weiß, das ist nutzlos, aber listView.SelectedItem.Id funktioniert nicht. @daniel – Skynet

+0

listview.SelectedItems [0] .Id Funktioniert das? @Skynet – Daniel

+0

Nein, ich kann keine ID nach "." Intellisense schlägt mir nur Equals, GetHashCode, GetType und ToString @daniel vor – Skynet

Verwandte Themen