Я пытаюсь разобрать файл json контактов в список и отобразить этот список пользователю в средстве выбора на моей странице с отображением имен контактов.
У меня есть файл json в root моего проекта под названием "контакты. json" и его действие по сборке установлено на встроенный ресурс.
мои контакты. json файл
{
"contacts": [
{
"name": "JOE",
"email": "name@handle",
"phoneNumber": "123-456-7890"
},
{
"name": "JYM",
"email": "name@handle",
"phoneNumber": "123-456-7890"
}
]
}
моя модель контакта :
public partial class RootObject
{
[JsonProperty("contacts")]
public List<Contact> Contacts { get; set; }
}
public partial class Contact
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("email")]
public string Email { get; set; }
[JsonProperty("phoneNumber")]
public string PhoneNumber { get; set; }
}
моя модель просмотра страницы, где я реализую json синтаксический анализатор
public partial class Page10 : BaseViewModel
{
private List<Contact> _contacts;
public List<InternalContact> contacts
{
get { return _contacts; }
set
{
_contacts = value;
OnPropertyChanged("contacts");
}
}
public Page10()
{
Title = "Spill Info";
contacts = GetJsonData();
}
private List<Contact> GetJsonData()
{
string jsonFileName = "contacts.json";
RootObject ObjContactList = new RootObject();
var assembly = typeof(Page10).GetTypeInfo().Assembly;
Stream stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.{jsonFileName}");
using (var reader = new System.IO.StreamReader(stream))
{
var jsonString = reader.ReadToEnd();
//Converting JSON Array Objects into generic list
ObjContactList = JsonConvert.DeserializeObject<RootObject>(jsonString);
}
return ObjContactList.Contacts;
}
}
моя baseViewModel
public class BaseViewModel : INotifyPropertyChanged
{
string title = string.Empty;
public string Title
{
get { return title; }
set { SetProperty(ref title, value); }
}
protected bool SetProperty<T>(ref T backingStore, T value,
[CallerMemberName]string propertyName = "",
Action onChanged = null)
{
if (EqualityComparer<T>.Default.Equals(backingStore, value))
return false;
backingStore = value;
onChanged?.Invoke();
OnPropertyChanged(propertyName);
return true;
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
var changed = PropertyChanged;
if (changed == null)
return;
changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
моя страница.xaml.cs
public partial class Page10 : ContentPage
{
public Page10()
{
InitializeComponent();
this.BindingContext = new contactviewmodel();
}
}
моя страница xaml
<ContentPage.Content>
<StackLayout>
<Picker Title="contacts" ItemsSource="{Binding contacts}" ItemDisplayBinding="{Binding Name}"/>
</StackLayout>
</ContentPage.Content>
После попытки выполнения вышеизложенного я получаю пустой сборщик при выборе, но я ожидаю увидеть JOE и JYM в сборщике.
edit 1: Мне удалось заставить их отображаться в списке, поэтому я попытался оттуда получить их в сборщике, но я получаю только список моих типов объектов, а не имен в сборщике. обновлен код для отражения изменений. изображение телефона с видом и списком контактов (пока не могу вставлять картинки, недостаточно реп.).
edit2: изменен код для отображения @Cherry Bu- MSFT Реализация