Из моего предыдущего вопроса на форуме по ссылке, Переберите ввод json и создайте древовидную иерархию, основанную на "ключах" с учетом дочерних "ключей" .Я строю на этом вопросе и хочу создать Treeview из содержимого List<KeyId>
.
Глубоко вложенный JSON отображается в дерево AC #, где у каждого узла есть два свойства - строковый ключ иlong T_id - а также набор дочерних элементов одного типа.
public partial class KeyIdObject
{
public string key { get; set; }
public long T_id { get; set; }
public List<KeyIdObject> Children { get; set; }
}
Структура json имеет следующую структуру:
{
"Soccer":{
"T_id":0,
"T_state":"valid",
"Clubs":{
"ClubA":{
"T_id":"1",
"T_state":"Champs"
},
"ClubB":{
"T_id":"2",
"T_state":"Runnerups"
}
},
"Subs":{
"SubA":{
"T_id":"3",
"T_state":"Unfit",
//this is nested key
"SubE":{
"T_id":"3",
"T_state":"Unfit"
}
}
},
"Subs_Used":{
"SubK":{
"T_id":"3",
"T_state":"Unfit"
}
}
//many more nested n-levels
}
}
Затем она может быть использована для генерацииСписок рекурсивного типа такой:
public partial class KeyIdObject
{
public static List<KeyIdObject> ToIdObjects(JToken root)
{
return root.TopDescendantsWhere<JObject>(o => o["T_id"] != null)
.Select(o => new KeyIdObject { key = ((JProperty)o.Parent).Name, T_id = (long)o["T_id"], Children = ToIdObjects(o) })
.ToList();
}
}
Содержимое List<KeyIdObject>
выглядит примерно так ниже:
Output List<KeyIdObject>:
[
{
"key": "Soccer",
"T_id": 0,
"Children": [
{
"key": "Clubs",
"Children": [
{
"key": "ClubA",
"T_id": 1
},
{
"key": "ClubB",
"T_id": 2
}
]
},
{
"key": "Subs",
"Children": [
{
"key": "SubA",
"T_id": 3,
"Children": [
{
"key": "SubE",
"T_id": 3
}
]
}
]
},
{
"key": "Subs_Used",
"Children": [
{
"key": "SubK",
"T_id": 3
}
]
}
]
}
]
Исходя из этой информации, я хочу иметь возможность анализировать каждый "ключ" иего дочерние элементы и создайте вид, подобный следующему, когда пользователь нажимает на соответствующую клавишу, будет раскрывающийся список с соответствующим содержимым.
>Soccer
>Clubs
ClubA
ClubB
>Subs
SubA
>Subs_Used
SubK
Я подумал, что было бы хорошо создать две ObservableCollectionследующим образом.
ObservableCollection<KeyIdObject> rootMenuItem;
// для хранения только строки "Soccer" и ее "T_id"? ObservableCollection<KeyIdObject> subMenuItem;
// добавить эту коллекцию как дочерний элемент кrootMenuItem в конце концов, после того, как сделано, populating
Когда я выполняю итерацию по результирующему выходному списку, я хочу использовать рекурсивную функцию, которая может добавить все «потомки» в иерархию, как показано в Выходных данных List<KeyIdObject>
, чтобы получить что-то вродеэто ниже:
>Clubs
ClubA
ClubB
>Subs
SubA
>Subs_Used
SubK
Я не уверен, как создать рекурсивную функцию, которая будет делать это.Любое руководство будет высоко ценится.Я не уверен, если это самый эффективный способ сделать это или есть лучший способ.
Я использую SfTreeView
от https://help.syncfusion.com/xamarin/sftreeview/getting-started