Я искал все возможности и до сих пор не могу выяснить, что не так с моим кодом. Позвольте мне объяснить: у меня есть представление карусели с помощью селектора Datatemplate и 2 dataTemplate, 1-й для отображения на первой странице, 2-й для отображения на странице второй карусели. Внутри этих таблиц данных я получил ListView, который никогда не заполняется. Я знаю, что ListView здесь, потому что, когда я пытаюсь обновить, где это должно быть, всплывает индикатор обновления. Сначала я подумал, что это из-за привязок, но даже без привязок, просто текстовая ячейка, та же проблема, ничего не отображается.
Вот мой код: 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:local="clr-namespace:TestDappli"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:control="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.CarouselView"
xmlns:testCarouselView="clr-namespace:TestDappli;assembly=TestDappli"
BackgroundColor="White"
x:Name="Mapage"
x:Class="TestDappli.MainPage">
<ContentPage.Resources>
<ResourceDictionary>
<!--Singapour template-->
<DataTemplate x:Key="Singapour">
<StackLayout Orientation="Vertical" Padding="30" Spacing="40" BackgroundColor="White" >
<Label Text="Singapour"
HorizontalOptions="CenterAndExpand"/>
<Label Text="Date :"
VerticalOptions="Start"/>
<DatePicker HorizontalOptions="Center"
Date="{x:Static sys:DateTime.Now}">
<DatePicker.Format>dd-MM-yyyy</DatePicker.Format>
<DatePicker.MinimumDate>
<sys:DateTime x:FactoryMethod="Parse">
<x:Arguments>
<x:String>Jan 1 2000</x:String>
</x:Arguments>
</sys:DateTime>
</DatePicker.MinimumDate>
<DatePicker.MaximumDate>
<sys:DateTime x:FactoryMethod="Parse">
<x:Arguments>
<x:String>Dec 31 2050</x:String>
</x:Arguments>
</sys:DateTime>
</DatePicker.MaximumDate>
</DatePicker>
<Label Text="Dispo :"/>
<ListView x:Name="HoraireViewSingapour"
IsPullToRefreshEnabled="True"
Refreshing="ListItems_Refreshing"
ItemSelected="OnSelection">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="SHOULD BE TEXT1" TextColor="DarkOrange" Detail="BUT THERE IS NOTHING HERE" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</DataTemplate>
<!--Bangalor template-->
<DataTemplate x:Key="Bangalor">
<StackLayout Orientation="Vertical" Padding="30" Spacing="40" BackgroundColor="White" >
<Label Text="Bangalor"
HorizontalOptions="CenterAndExpand"/>
<Label Text="Date :"
VerticalOptions="Start"/>
<DatePicker HorizontalOptions="Center"
Date="{x:Static sys:DateTime.Now}">
<DatePicker.Format>dd-MM-yyyy</DatePicker.Format>
<DatePicker.MinimumDate>
<sys:DateTime x:FactoryMethod="Parse">
<x:Arguments>
<x:String>Jan 1 2000</x:String>
</x:Arguments>
</sys:DateTime>
</DatePicker.MinimumDate>
<DatePicker.MaximumDate>
<sys:DateTime x:FactoryMethod="Parse">
<x:Arguments>
<x:String>Dec 31 2050</x:String>
</x:Arguments>
</sys:DateTime>
</DatePicker.MaximumDate>
</DatePicker>
<Label Text="Dispo :"/>
<ListView x:Name="HoraireViewBangalor"
IsPullToRefreshEnabled="True"
Refreshing="ListItems_Refreshing"
ItemSelected="OnSelection">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="SHOULD BE SOME TEXT HERE " TextColor="DarkOrange" Detail="BUT THERE IS NOT" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</DataTemplate>
<!--Template selector-->
<testCarouselView:CarouselTemplateSelector x:Key="CarouselTemplateSelector"
Singapour="{StaticResource Singapour}"
Bangalor="{StaticResource Bangalor}" />
</ResourceDictionary>
</ContentPage.Resources>
<control:CarouselView
x:Name="MyCarouselView"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
ItemTemplate="{StaticResource CarouselTemplateSelector}"
>
</control:CarouselView>
</ContentPage>
Тогда задний код:
public partial class MainPage : ContentPage
{
public ObservableCollection<Creneau> List = new ObservableCollection<Creneau>();
public ObservableCollection<Salle> Salle = new ObservableCollection<Salle>();
public MainPage()
{
BindingContext = this;
CreateList();
InitializeComponent();
this.MyCarouselView.ItemsSource = Salle;
doRefresh();
}
public async void OnSelection(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null)
{
return;
}
else
{
var answer = await DisplayAlert("Reservation", "Voulez vous reserver la salle SALLE de " + ((Creneau)e.SelectedItem).start + "h à " + ((Creneau)e.SelectedItem).end + "h", "Yes", "No");
if (answer)
{
ChangeOccupe((Creneau)e.SelectedItem);
}
}
}
protected void ListItems_Refreshing(object sender, EventArgs e)
{
doRefresh();
((ListView)sender).EndRefresh();
}
protected void doRefresh()
{
}
protected void CreateList()
{
for (int i = 8; i < 20; i++)
{
Creneau cr = new Creneau("Libre", i, i + 1);
List.Add(cr);
}
Salle BangalorS = new Salle("Bangalor", List);
Salle.Add(BangalorS);
Salle SingapourS = new Salle("Singapour", List);
Salle.Add(SingapourS);
}
protected void ChangeOccupe(Creneau c)
{
foreach (Creneau cre in List)
{
if (c.Equals(cre))
{
if (cre.VarOccupe == "Libre")
{
cre.VarOccupe = "Reservée";
}
else
{
cre.VarOccupe = "Libre";
}
}
}
}
}
Вот шаблон выбора для карусели:
public class CarouselTemplateSelector : DataTemplateSelector
{
public DataTemplate Singapour { get; set; }
public DataTemplate Bangalor { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
Salle salle = (Salle)item;
switch (salle.name)
{
case "Singapour":
return Singapour;
case "Bangalor":
return Bangalor;
default:
throw new ArgumentOutOfRangeException();
}
}
}
Оба класса Салле и Крено
public class Salle
{
public string name;
public ObservableCollection<Creneau> list = new ObservableCollection<Creneau>();
public Salle(string name, ObservableCollection<Creneau> cren)
{
this.name = name;
list = cren;
}
}
public class Creneau : INotifyPropertyChanged
{
private string occupe;
public string VarOccupe
{
get
{
return occupe;
}
set
{
occupe = value;
OnPropertyChanged("VarOccupe");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public int start { get; set; }
public int end { get; set; }
public string creneau { get; set; }
public Creneau(string occuper,int start, int end)
{
this.end = end;
this.occupe = occuper;
this.start = start;
creneau = start.ToString() + "h " + "- " + end.ToString() + "h :";
}
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Если у вас есть идеи по поводу проблемы, я открыт для любых предложений, я пробовал все в течение 2 дней.
Заранее спасибо
[ Редактировать ] Я пытался с TableView, он работает, так что это может быть из таблицы данных в представлении списка? Я имею в виду, что нигде не видел, чтобы я не мог поместить DataTemplate внутри DataTemplate