C# 从ListView SelectedItem传递json对象数据

C# 从ListView SelectedItem传递json对象数据,c#,json,win-universal-app,C#,Json,Win Universal App,我需要一些关于传递ListView Id(我从json获得)的帮助 我使用对服务器的API调用填充listView: private async void searchButton_Click(object sender, RoutedEventArgs e) { var textFrom = odTextBox.Text; var textTo = doTextBox.Text; var searchResult = aw

我需要一些关于传递ListView Id(我从json获得)的帮助

我使用对服务器的API调用填充listView:

        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;
    }
现在,当我单击listView的一个项目时,我想导航到另一个页面(CarShareDetailedPage)并再次调用API,以获取关于该项目的更详细数据。因此,我需要将selectedItem id从一个页面传递到另一个页面。我该怎么做

我正在导航到另一个页面,如下所示:

        private void listView_Tapped(object sender, TappedRoutedEventArgs e)
    {
        Frame.Navigate(typeof(CarShareDetailedPage), listView.SelectedIndex);
    }
该页面上的OnNagiatedMethod是:

        protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var value = e.ToString();
        carShareTextBox.Text = value;
    }
我的json类是:

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; }
    }
公共类汽车共享列表
{
[JsonProperty(“id”)]
公共int Id{get;set;}
[JsonProperty(“类型”)]
公共字符串类型{get;set;}
[JsonProperty(“来自_id”)]
来自ID{get;set;}的公共字符串
[JsonProperty(“来自国家”)]
来自国家的公共字符串{get;set;}
[JsonProperty(“来自国家/地区/名称”)]
来自CountryName{get;set;}的公共字符串
[JsonProperty(“to_id”)]
公共字符串ToId{get;set;}
[JsonProperty(“to”)]
{get;set;}的公共字符串
[JsonProperty(“至国家”)]
国家的公共字符串{get;set;}
[JsonProperty(“收件人国家名称”)]
ToCountryName{get;set;}的公共字符串
[JsonProperty(“时间”)]
公共字符串时间{get;set;}
[JsonProperty(日期为iso8601”)]
公共日期时间DateIso8601{get;set;}
[JsonProperty(“已添加”)]
已添加公共日期时间{get;set;}
[JsonProperty(“价格”)]
公共双价{get;set;}
[JsonProperty(“num_人”)]
公共双numpople{get;set;}
[JsonProperty(“作者”)]
公共字符串作者{get;set;}
[JsonProperty(“作者”)]
公共字符串IsAuthor{get;set;}
[JsonProperty(“评论”)]
公共字符串注释{get;set;}
[JsonProperty(“联系人”)]
公共字符串联系人{get;set;}
[JsonProperty(“日期”)]
公共字符串日期{get;set;}
[JsonProperty(“完整”)]
公共字符串已满{get;set;}
[JsonProperty(“被保险人”)]
公共字符串{get;set;}
[JsonProperty(“共享类型”)]
公共字符串共享类型{get;set;}
[JsonProperty(“确认的联系人”)]
公共字符串确认联系人{get;set;}
[JsonProperty(“书签”)]
公共对象书签{get;set;}
[JsonProperty(“from”)]
来自{get;set;}的公共字符串
}
公共类CarshareResponse
{
[JsonProperty(“搜索类型”)]
公共字符串搜索类型{get;set;}
[JsonProperty(“carshare_列表”)]
公共IList CarshareList{get;set;}
}
让我说这是我第一次用API和json做任何工作。 谢谢你的帮助

编辑:我在下面添加了API的代码,所以这应该是我所有的代码了

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;
            }
    }
}
公共类PrevoziApi
{公共静态异步任务searchAsync(
来自城市的字符串,
字符串toCity,
日期时间日期,
string type=“共享”,
CancellationToken=默认值(CancellationToken))
{
使用(var client=new RestClient(“https://prevoz.org/api/"))
{
var request=new RestRequest(“search/”+type+“/”,HttpMethod.Get);
请求。添加查询参数(“f”,来自城市);
请求。添加查询参数(“fc”、“SI”);
请求。添加查询参数(“t”,toCity);
请求。添加查询参数(“tc”、“SI”);
request.AddQueryParameter(“d”,date.ToString(“yyyy-MM-dd”);
请求。AddQueryParameter(“精确”、“真实”);
返回
(等待客户端。执行(请求、令牌))。数据;
}
}
}

因此,您可以按时间进行订购,但只显示一个字符串,上面写着“[Contact][time]”。这本身与从搜索方法返回的JSON没有任何关系。你要做的不是把它做成一个数组,而是做成一个列表对象,它可以存储一些关于发送请求的额外“背景”数据

这将需要你付出更多的努力。您将要创建一个类

public class CarItemView {
    public string DisplayText {get; set;}
    public int ID {get; set;}
}
然后用你想传递的任何数据填充它。然后在过滤中,您将执行以下操作:

List<CarItemView> array = searchResult.CarshareList
            .OrderBy(cs => cs.Time)
            .Select(cs => new { DisplayText = cs.Contact + " " + cs.Time, ID = cs.Id}).ToList();
然后,对于接收页面:

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 */
}
更新:此答案已从原始答案更新,以反映使用数组而不是列表对象


我希望这有帮助

因此,您可以按时间排序,但只显示一个字符串,上面写着“[Contact][time]”。这本身与从搜索方法返回的JSON没有任何关系。你要做的不是把它做成一个数组,而是做成一个列表对象,它可以存储一些关于发送请求的额外“背景”数据

这将需要你付出更多的努力。您将要创建一个类

public class CarItemView {
    public string DisplayText {get; set;}
    public int ID {get; set;}
}
然后用你想传递的任何数据填充它。然后在过滤中,您将执行以下操作:

List<CarItemView> array = searchResult.CarshareList
            .OrderBy(cs => cs.Time)
            .Select(cs => new { DisplayText = cs.Contact + " " + cs.Time, ID = cs.Id}).ToList();
然后,对于接收页面:

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 */
}
更新:此答案已从原始答案更新,以反映使用数组而不是列表对象

我希望这有帮助

这是有效的:

        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        
    }
谢谢@daniel,这基本上是按照你的建议,有一些错误,但是在我管理的c#chat频道的一些人的帮助下。感谢所有人。

这项工作:

        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        
    }

谢谢@daniel,这基本上是按照你的建议,有一些错误,但是在我管理的c#chat频道的一些人的帮助下。感谢大家。

正如您所说,ID对于CarshareList中的每个项目都是唯一的,有了这个ID,我可以毫无问题地获取更多数据。我把listView.SelectedIndex作为一个例子,我知道这没用,但listView.SelectedItem.Id不起作用@丹麦人