#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:
Вы можете использовать для этого гибкий макет
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/flex-layout
https://devblogs.microsoft.com/xamarin/adaptive-mobile-designs-with-flexlayout/