У меня есть этот ListView в приложении Xamarin:
<ListView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{x:Static local:Person.All}" x:Name="list">
<ListView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
И я пытаюсь связать его с IEnumerable<Person>
, установив свойство ItemsSource
для нового перечисляемого.(Да, я знаю, что должен создать модель представления, но я ненавижу MVVM со страстью!) Но когда в перечислимом есть данные, я получаю эту ошибку:
System.InvalidCastException: указанное приведениенедопустимо.
Это не происходит сразу после установки ItemsSource
;У меня есть блок try / catch, содержащий операцию set, но исключение не происходит.Скорее это происходит, как только я выхожу из метода, в котором я устанавливаю ItemsSource
.Нет трассировки стека, связанной с этой ошибкой;это все, что я получаю, кроме какого-то общего сообщения «Необработанное исключение».
Вот метод, в котором я устанавливаю ItemsSource
:
private void BtnLogIn_Clicked(object sender, EventArgs e)
{
try
{
// log in
var req = WebRequest.CreateHttp($"http://{Configuration.Hostname}/api/login?systemID=1091&login={txtLogin.Text}&password={txtPassword.Text}");
var resp = (HttpWebResponse)req.GetResponse();
var cookiesData = resp.Headers.Get("Set-Cookie");
var regex = new Regex($@"{CookieManager.LoginCookieID}=(.*); expires=.*");
Login.CookieValue = regex.Match(cookiesData).Groups[1].Captures[0].Value;
list.ItemsSource = Person.All; // reload person list
}
catch (Exception ex)
{
DisplayAlert("Error", ex.ToString(), "OK");
}
}
(да, я знаю, что ввод пароля вURL - плохая идея, это просто подтверждение концепции!)
А вот класс Person
:
public class Person
{
public static IEnumerable<Person> All => GetWebData<IEnumerable<Person>>($"http://{Configuration.Hostname}/api/people", CookieManager.LoginCookieID, Login.CookieValue);
private static T GetWebData<T>(string url, string cookieKey, string cookieValue)
{
try
{
var web = WebRequest.CreateHttp(url);
web.Headers["Set-Cookie"] = $"{cookieKey}={cookieValue}";
var stream = web.GetResponse().GetResponseStream();
var sr = new StreamReader(stream);
T data;
var json = sr.ReadToEnd();
sr.Close();
try
{
data = JsonConvert.DeserializeObject<T>(json);
}
catch
{
data = JsonConvert.DeserializeObject<IEnumerable<T>>(json).Single();
}
return data;
}
catch
{
// could not access data, maybe not logged in yet?
return default(T);
}
}
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name => $"{FirstName} {LastName}";
}