2015-07-07 5 views
0

У меня есть следующий JSON-url. Я пытаюсь заполнить свой список, используя подмассивные волосы [] и математику [] после получения их из URL JSON.Отображение списка посещений с использованием подмассива JSON

Вот гиперссылка http://pastebin.com/raw.php?i=2fzqLYXj

Внутри массива «Студенты» есть подмассив называется «Свойство», а другой к югу от массива внутри «Свойства» под названием «Оценка». «волосы» находятся внутри «Свойства», а «математика» находится внутри «Града».

Вот мой WebService класс

public class WebService 
    { 
     public WebService() 
     { 

     } 

     public async Task<Rootobject> GetStudentInfoAsync (string apiurl) { 

      var client = new HttpClient(); 

      var response = await client.GetStringAsync(string.Format(apiurl)); 

      return JsonConvert.DeserializeObject<Rootobject>(response.ToString()); 

     } 
    } 

А вот мой вид Модель

public class Property 
    { 

     public int iq { get; set; } 
     public string hair { get; set; } 
     public string glasses { get; set; } 

     public Grade[] Grades { get; set; } 

    } 
    public class StudentInfo 
    { 
     public string name { get; set; } 
     public string lastname { get; set; } 

     public Property[] Properties { get; set; } 

     public string StudentName { 
      get{ return String.Format ("{0}", name); } 
     } 
//I am accessing the JSON sub arrays with the following to get the "hair" and "math" properties. 

     public string[] HairColors 
    { 
     get 
     { 
      return (Properties ?? Enumerable.Empty<Property>()).Select(p => p.hair).ToArray(); 
     } 
    } 
     public string[] MathGrades 
    { 
     get 
     { 
      return (Properties ?? Enumerable.Empty<Property>()).SelectMany(p => p.Grades ?? Enumerable.Empty<Grade>()).Select(g => g.Math).ToArray(); 
     } 
    } 

    } 

    public class Rootobject 
    { 
     public StudentInfo[] students { get; set; } 

    } 
} 

А вот как я заполнить мой список представления с именами студентов, который работает. Заметьте, что «StudentName» не было в подмассиве.

var sv = new WebService(); 
      var es = await sv.GetStudentInfoAsync(apiurl); 
      Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { 

       listView.ItemsSource = es.students; 
      }); 
var cell = new DataTemplate (typeof(TextCell)); 

      listView.ItemTemplate = cell; 
      listView.ItemTemplate.SetBinding(TextCell.TextProperty, "StudentName"); 

Но мне нужно, чтобы заполнить свой список вид с HairColors и MathGrades следующим образом, но следующий код не работает.

var sv = new WebService(); 
      var es = await sv.GetStudentInfoAsync(apiurl); 
      Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { 

       listView.ItemsSource = es.students; 
      }); 
var cell = new DataTemplate (typeof(TextCell)); 

      listView.ItemTemplate = cell; 
      listView.ItemTemplate.SetBinding(TextCell.TextProperty, "HairColors"); 
     listView.ItemTemplate.SetBinding (TextCell.DetailProperty, "MathGrades"); 

Что не этот код работает? Как мне заставить работать?

+0

Что именно вы имеете в виду «не работает»? –

+0

То, что я имею в виду, это то, что список не заполнен ничем, и я не получаю никаких ошибок. – Carell

+0

Вы пытались вернуть одну строку вместо массива? HairColors - это массив, что именно должно отображаться в ячейке? Первый элемент? Все элементы? –

ответ

0

Вы можете сделать пользовательский конвертер для этого:

public class HairColorsConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var hairColors = (string[])value; 

     return string.Join(", ", hairColors); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Затем связать это как:

SetBinding(TextCell.TextProperty, "HairColors", BindingMode.Default, new HairColorsConverter()); 
Смежные вопросы