C# 从ListView SelectedItem传递json对象数据
我需要一些关于传递ListView Id(我从json获得)的帮助 我使用对服务器的API调用填充listView: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
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不起作用@丹麦人