InvalidCastException при привязке Xamarin ListView к IEnumerable <Person> - PullRequest
0 голосов
/ 10 июля 2019

У меня есть этот 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}";
}

1 Ответ

0 голосов
/ 10 июля 2019

Я понял это - похоже, <Label Text="{Binding Name}" /> недопустимо в качестве DataTemplate;Я изменил Label на TextCell и все работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...