Как передать список в модель и позже привязать к сетке

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

Как получить полный список игроков для отображения на домашней странице, под строкой кода отображается одна запись

var details = (from x in conn.Table<PlayerDetails>() select x).ToList();

Это проблема с моим кодом или Home.xaml? Я пытался

 playermodel = details[0];
playermodel = details[1];
playermodel = details[2]; 
  

но все равно выдает только одну запись.

Мой Home.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"  
             x:Class="soccerapp.Home" BackgroundColor="White" Title="Home">
    <ContentPage.Content>
        <Grid x:Name="gridDisplay" Padding="10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <!-- Use Grid.Column to specify column -->

            <Label Grid.Row="0" Grid.Column="0" Text="{Binding FullName}" BackgroundColor="#92f459"/>
            <Label x:Name="HomeLabel"  Text="Home Page is here" TextColor="White"  Grid.Row="0" Grid.Column="1" 
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" FontSize="Small"></Label>
        </Grid>
    </ContentPage.Content>

</ContentPage>  
  

Ниже мой Home.xaml.cs

 namespace soccerapp
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Home : ContentPage
    {
        public SQLiteConnection conn = null;

        public Home(string parameter1)
        {
            InitializeComponent();
            conn = DependencyService.Get<Isqlite>().GetConnection();
            conn.CreateTable<PlayerDetails>();
            DisplayDetails();
        }

        public void DisplayDetails()
        {

            var details = (from x in conn.Table<PlayerDetails>() select x).ToList();
            PlayerDetails playermodel = details[0];
            gridDisplay.BindingContext = playermodel;
        }


    }
}
  

введите описание изображения здесь

Комментарии:

1. ваш запрос отображается правильно — если вы получаете только одну запись, это, вероятно, означает, что в вашей таблице есть только одна запись

2. Нет, Джейсон, доступны еще две записи, я не уверен, что моя сетка в ‘Home.xaml’ корректна для отображения всех игроков?

3. Извините, я неправильно понял ваш вопрос. Если вы хотите привязать коллекцию к сетке, вам нужно использовать привязываемые макеты: learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface /…

4. Пробовал с <Grid BindableLayout.ItemsSource="{Binding Items}" /> согласно приведенной выше ссылке. Но это не работает

5. Согласно моему вопросу, как мы помещаем details в playermodel' , а затем привязываем к макету сетки. Правильно ли / хорошо ли выглядит мой макет Home.xaml?

Ответ №1:

Я изменил ваш xaml код и использование collectionView для достижения ваших требований.

В вашем Home.xaml я использую CollectionView для отображения данных игроков, вы можете добавить другие метки для отображения других данных DataTemplate . Если вы хотите изменить количество элементов в строке, просто измените значение Span :

 <ContentPage.Resources>
    <DataTemplate x:Key="playerTemplate">
        <ContentView>
            <StackLayout  Margin="10,10" BackgroundColor="LightGreen">
                <Label Text="{Binding FullName}" />

                <Label Text="{Binding Mobile}" />

                <!--Add other labels here to show want you want to show--> 

            </StackLayout>

        </ContentView>
    </DataTemplate>


</ContentPage.Resources>

<StackLayout Margin="20">
    <CollectionView x:Name="collectionview"

             ItemTemplate="{StaticResource playerTemplate}" >


        <!--span here decides the number of items shows in one line. Now is 3 items one line-->
        <CollectionView.ItemsLayout>
            <GridItemsLayout Orientation="Vertical" Span="3" />
        </CollectionView.ItemsLayout>

    </CollectionView>
</StackLayout>
  

В вашем коде каждый раз, когда вы получаете данные, устанавливайте для них значение itemSource , и они будут меняться в collectionView :

 public partial class Home : ContentPage
{
    public SQLiteConnection conn = null;
    public PlayerDetails playermodel;

    ObservableCollection<PlayerDetails> players;

    public Home(string parameter1)
    {

        InitializeComponent();
        conn = DependencyService.Get<Isqlite>().GetConnection();
        conn.CreateTable<PlayerDetails>();
        players = new ObservableCollection<PlayerDetails>();

        collectionview.ItemsSource = players;

        DisplayDetails();
    }

    public void DisplayDetails()
    {

        List<PlayerDetails> details = (from x in conn.Table<PlayerDetails>() select x).ToList();

        for (int i = 0; i < details.Count; i  )
        {
            players.Add(details[i]);

        }
    }
}
  

См.: collectionview

Вот результат:

Игроки

Обновить:

CollectionView доступен в Xamarin.Предварительные версии Forms 4.0. Однако в настоящее время он является экспериментальным и может быть использован только путем добавления следующей строки кода в ваш класс AppDelegate на iOS или в ваш класс MainActivity на Android перед вызовом Forms.Инициализация:

 Forms.SetFlags("CollectionView_Experimental");
  

Комментарии:

1. Отсортировал эту collectionview контекстную ошибку .. но теперь при переходе к дому на этом шаге выдается ошибка InitializeComponent(); со следующими сведениями об ошибке System.InvalidOperationException: The class, property, or method you are attempting to use ('VerifyCollectionViewFlagEnabled') is part of CollectionView; to use it, you must opt-in by calling Forms.SetFlags("CollectionView_Experimental") before calling Forms.Init().

2. Хуа Большое вам спасибо за ваш ответ. Ценю ваши усилия. Является ли CollectionView экспериментальной версией? Я получаю вышеуказанную ошибку при InitializeComponent()

3. @soccerway Нет, вы добавили не в том месте. Поместите его в MainActivity в Android.project.

4. @soccerway Попробуйте мое редактирование. Я изменил код в DisplayDetails() .

5. @soccerway Я не использовал данные из базы данных на своей стороне. Я создаю некоторые временные модели playerDeatils при тестировании, поэтому, возможно, из-за того, что проигрыватели были инициализированы снова в более раннем коде.

Ответ №2: