Как исправить пустой просмотр списка на странице мобильного приложения xamarin.forms - PullRequest
1 голос
/ 02 мая 2019

Я учусь использовать Xamarin.Forms с призмой, я хочу заполнить представление списка конкретным элементом из каждого объекта в моем списке.Мой список отображается пустым, но я не вижу никаких ошибок.

Я пытался использовать привязку для привязки к переменным Name в моих объектах в моем списке.Это оказалось пустым, поэтому я попытался использовать Observable Collection, чтобы получить мой список и добавить каждое имя.

Это объектная модель Animal

using System;
namespace LearningPrism.Models
{
    class Animal
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public decimal Happiness { get; set; }

        public void PrintBase()
        {
            Console.WriteLine($"Name: {Name}");
            Console.WriteLine($"Age: {Age}");
            Console.WriteLine($"Happy: {Happiness}");
            Console.WriteLine();
        }
    }
}

Я создаю свой список, используя класс Breed в качествеобъект и имеет 3 функции ниже, которые получают отфильтрованный список для типа (нефильтрованный для получения всех пород).

namespace LearningPrism.Models
{
    class Breed
    {

        public static List<Animal> _breedList = new List<Animal>
            {
                new Animal
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "Greyhound",
                    Type = BreedType.Dog
                },

//There are 3 more Dog Animal breeds but I have removed them so it is easier to read

                new Animal
                {
                    Id = Guid.NewGuid().ToString(),
                    Name = "Bengal",
                    Type = BreedType.Cat
                }, 

//There are 3 more Cat Animal breeds but I have removed them so it is easier to read

                }
            };

        public static List<Animal> GetAllBreeds()
        {
            return _breedList;
        }

        public static List<Animal> GetBreedsByType(BreedType type)
        {

            switch (type)
            {
                case BreedType.Dog:
                    return (from Animal in _breedList where Animal.Type == BreedType.Dog select Animal).ToList();

                case BreedType.Cat:
                    return (from Animal in _breedList where Animal.Type == BreedType.Cat select Animal).ToList();

                default:
                    return _breedList;

            }
        }
    }
}

Вот моя модель представления:

namespace LearningPrism.ViewModels
{
    public class PageAViewModel : ViewModelBase
    {
        private List<Breed> MyList { get; set; }

        public PageAViewModel(INavigationService navigationService) : base(navigationService)
        {
            Title = "Hello Human";
        }

        private void LoadData()
        {

            ObservableCollection<Animal> myData = new ObservableCollection<Animal>(Breed.GetAllBreeds() as List<Animal>);

        }

        public override void OnNavigatingTo(INavigationParameters parameters)
        {
            base.OnNavigatingTo(parameters);

            LoadData();
        }
    }
}

Вот XAMLкод для страницы

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="LearningPrism.Views.PageA" Title="{Binding Title}">

    <Label Text="{Binding Title}" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" />

    <StackLayout>

        <ListView HorizontalOptions="FillAndExpand" 
                  VerticalOptions="FillAndExpand" 
                  ItemsSource="{Binding myData}">

            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackLayout HorizontalOptions="CenterAndExpand">
                        <Label Text="{Binding Breed.Name}" TextColor="Black"></Label>
                    </StackLayout>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>

    </StackLayout>

</ContentPage>

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Во-первых, чтобы связать ваше ListView с myData, myData должно быть общедоступным свойством.

public ObservableCollection<Animal> myData { get; set; }

Если каждый элемент в вашем списке является Animal, тогда ваш путь привязкибудет Text="{Binding Name}", потому что Name является свойством Animal.Breed собственности нет.

1 голос
/ 02 мая 2019

Как упоминал Джейсон выше

Ваша собственность:

private List<Breed> MyList { get; set; }

Должна быть публичной.Я также рекомендовал бы, если вы используете призму для использования события изменения свойства: измените свою собственность на:

private List<Breed> _myList;
    public List<Breed> MyList
    {
        get { return _myList; }
        set { _myList = value; RaiseOnPropertyChanged(); }
    }

Затем измените свой список XAML на:

<ListView HorizontalOptions="FillAndExpand" 
              VerticalOptions="FillAndExpand" 
              ItemsSource="{Binding MyList}">
        <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
                 <StackLayout HorizontalOptions="CenterAndExpand">
                     <Label Text="{Binding Name}" TextColor="Black"> 
                     </Label>                  
                </StackLayout>
              </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...