0
votes

Ok so heres the basic of my app : On opening im in the AcceuilPage.xaml, i click the + icon to add a new item to the collection.

Then it brings me to the NewFormPage.xaml which i use to fill a data form, then when i click save i call the SaveButtonClicked method from NewFormPage.xaml.cs BUT my app just crash and i get: Unhandled Exception: System.InvalidCastException: Specified cast is not valid. But i have no clue why ?

Thanks for your help !

Also, i tried this to see if data were created and everything was working fine :

private void CreateSampleData()
{
    base.OnAppearing();
    ObservableCollection<Agenda> list = new ObservableCollection<Agenda>();
    list.Add(new Agenda { Topic = "Journée au chantier", Duration = "07:30 UTC - 11:30 UTC", Color = "#B96CBD", Date = new DateTime(2020, 3, 23) });
    list.Add(new Agenda { Topic = "Journée au chantier", Duration = "07:30 UTC - 11:30 UTC", Color = "#B96CBD", Date = new DateTime(2020, 3, 23) });
    AgendaCollection.ItemsSource = list;
}

Heres the code :

AgendaDatabase.cs in the Database folder

using System;
using System.Collections.Generic;
using System.Text;
using SQLite;
using Calculette.Models;
using System.Threading.Tasks;

namespace Calculette.Database
{
    public class AgendaDatabase
    {
        readonly SQLiteAsyncConnection database;

        public AgendaDatabase(string dbPath)
        {
           
            database = new SQLiteAsyncConnection(dbPath);
            database.CreateTableAsync<Agenda>().Wait();
        


        }

        // Get all agenda
        public Task<List<Agenda>> GetAgendasAsync()
        {
            return database.Table<Agenda>().ToListAsync();
        }

        // Get specific agenda
        public Task<Agenda> GetAgendaAsync(int id)
        {
            return database.Table<Agenda>()
                            .Where(i => i.ID == id)
                            .FirstOrDefaultAsync();
        }

        // Insert new agenda (save)
        public Task<int> SaveAgendaAsync(Agenda agenda)
        {
            if (agenda.ID != 0)
            {
                return database.UpdateAsync(agenda);
            }
            else
            {
                return database.InsertAsync(agenda);
            }
        }
        
        //Delete specific agenda
        public Task<int> DeleteAgendaAsync(Agenda agenda)
        {
            return database.DeleteAsync(agenda);
        }
    }
}

Agenda.cs in Models folder

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using SQLite;
using Calculette.Database;

namespace Calculette.Models
{
    public class Agenda
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Topic { get; set; }
        public string Duration { get; set; }
        public DateTime Date { get; set; }
    }
}

NewFormPage.xaml in the views folder

 <ContentPage.Content>
        
        
        <StackLayout>
            <StackLayout >
            <Label Text="Date de calcul:" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
            <DatePicker x:Name="Datepicker" Date="{Binding Date}" FontFamily="ROBOTO" Format="yyyy-MM-dd" ></DatePicker>

            </StackLayout>

            <StackLayout >
                <Label Text="Description" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Description" Text="{Binding Topic}"/>

            </StackLayout>

            <StackLayout>
                <Label Text="Durée quotidienne" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Duree" Placeholder="HH:MM:SS" Text="{Binding Duration}"/>
            </StackLayout>

            <StackLayout>
                <Label Text="Niveau de pression dB(A)" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Pression" Text="{Binding Pression}"/>
            </StackLayout>


            <Editor Text="{Binding Commentary}"
                x:Name="Commentary" 
                AutoSize="TextChanges" 
                Placeholder="Commentaires" />

            <StackLayout>
                <Button Text="Save" x:Name="SaveButton"  TextColor="#008A00" BackgroundColor="#FFFFFF" BorderWidth="1" BorderColor="#1A961A" Clicked="SaveButtonClicked"></Button>
                <ActivityIndicator IsRunning="{Binding IsBusy}"/>

            </StackLayout>
        </StackLayout>


    </ContentPage.Content>

NewFormPage.xaml.cs in the views folder

using Calculette.Models;
using Calculette.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Calculette.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class NewFormPage : ContentPage
    {
        public NewFormPage ()
        {
            InitializeComponent ();
            BindingContext = new FormViewModel();
            
        }

        async void SaveButtonClicked(object sender, EventArgs e)
        {
            
            var agenda = (Agenda)BindingContext;
           //agenda.Date = DateTime.UtcNow;
            await App.Database.SaveAgendaAsync(agenda);
            await Navigation.PopAsync();

        }

    }
}

AcceuilPage.xaml

 <ContentPage.Content>
            <!-- ScrollView nous permet d'avoir une page scrollable-->
     
                <ScrollView Orientation="Vertical">
                
                <CollectionView Grid.Row="2" Margin="25" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
                        SelectionMode="None"  x:Name="AgendaCollection"> <!--ItemsSource="{Binding AngedaCollection}" -->
                    <CollectionView.Header>
                        <StackLayout Orientation="Horizontal" Spacing="220">
                            
                            <Label Text="Agenda" TextColor="Black" FontSize="18"/>
                            
                            <ImageButton Source="iconplus.png"  HeightRequest="30" WidthRequest="30" Clicked="GoToNewFormPage"></ImageButton>
                           
                            

                        </StackLayout>
                        
                        

                    </CollectionView.Header>

                    <CollectionView.ItemsLayout>
                        <LinearItemsLayout Orientation="Vertical" ItemSpacing="20"/>
                    </CollectionView.ItemsLayout>
                    <CollectionView.ItemTemplate >
                        <DataTemplate>
                            
                                <pv:PancakeView HasShadow="True" BackgroundColor="White" VerticalOptions="StartAndExpand " 
                                    HorizontalOptions="FillAndExpand">
                                <Grid VerticalOptions="StartAndExpand" HorizontalOptions="FillAndExpand">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <BoxView BackgroundColor="{Binding Color}" WidthRequest="3" HorizontalOptions="Start"
                                     VerticalOptions="FillAndExpand"/>
                                    <Expander Grid.Column="1">
                                        <Expander.Header>
                                            <Grid HorizontalOptions="FillAndExpand">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="3.5*"/>
                                                </Grid.ColumnDefinitions>
                                                <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
                                                    <Label Text="{Binding Date, StringFormat='{0:dd}'}" TextColor="#008A00" FontSize="27" 
                                                   HorizontalOptions="Center"/>

                                                    <Label Text="{Binding Date, StringFormat='{0:MMMM}'}" TextColor="Black" FontSize="10" 
                                                   HorizontalOptions="Center" Margin="0,-10,0,0" FontAttributes="Bold"/>
                                                    <ImageButton Source="iconplus.png" HorizontalOptions="Center" HeightRequest="30" WidthRequest="30" Clicked="GoToFormPage"></ImageButton>
                                                </StackLayout>
                                                <BoxView Grid.Column="1" BackgroundColor="#F2F4F8" WidthRequest="1" HorizontalOptions="Start" 
                                                 VerticalOptions="FillAndExpand"/>
                                                <StackLayout Grid.Column="2" HorizontalOptions="Start" VerticalOptions="Center" Margin="20">
                                                    <Label Text="{Binding Topic}" TextColor="#008A00" FontSize="15" FontAttributes="Bold"/>
                                                    <Label Text="{Binding Duration}" TextColor="#2F3246" FontSize="12" Margin="0,-10,0,0"/>
                                                </StackLayout>
                                            </Grid>
                                        </Expander.Header>
                                        <Grid HorizontalOptions="FillAndExpand">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                                <ColumnDefinition Width="3.5*"/>
                                            </Grid.ColumnDefinitions>
                                            <BoxView Grid.Column="1" BackgroundColor="#F2F4F8" WidthRequest="1" HorizontalOptions="Start" 
                                             VerticalOptions="FillAndExpand"/>
                                            <StackLayout Grid.Column="2" Spacing="10">
                                                <Label Text="Tâches" TextColor="Black" FontSize="15" Margin="20,0"/>
                                                <StackLayout BindableLayout.ItemsSource="{Binding Speakers}" HorizontalOptions="Start" VerticalOptions="Center" Margin="20,0,0,20">
                                                    <BindableLayout.ItemTemplate>
                                                        <DataTemplate>
                                                            <Label TextColor="#2F3246" FontSize="12">
                                                                <Label.FormattedText>
                                                                    <FormattedString>
                                                                        <FormattedString.Spans>
                                                                            <Span Text="{Binding Time}"/>
                                                                            <Span Text=" - "/>
                                                                            <Span Text="{Binding Name}" FontAttributes="Bold"/>
                                                                        </FormattedString.Spans>
                                                                    </FormattedString>
                                                                </Label.FormattedText>
                                                            </Label>
                                                        </DataTemplate>
                                                        
                                                    </BindableLayout.ItemTemplate>
                                                    
                                                </StackLayout>

                                                
                                            </StackLayout>
                                        </Grid>
                                    </Expander>
                                </Grid>
                            </pv:PancakeView>
                            
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>



            </ScrollView>
              
        </ContentPage.Content>

AcceuilPage.xaml.ca

public partial class MainPage : TabbedPage
    {
        public MainPage()
        {
            InitializeComponent();
            this.BindingContext = this;
           
        }
        protected async void GoToFormPage(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new Views.AgendaItemDetailPage());
        }
        protected async void GoToNewFormPage(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new Views.NewFormPage());
        }
    protected override async void OnAppearing()
    {
       base.OnAppearing();
        AgendaCollection.ItemsSource = await App.Database.GetAgendasAsync();
    }
}
1

1 Answers

1
votes

here, BindingContext is declared as a FormViewModel

    public NewFormPage ()
    {
        InitializeComponent ();
        BindingContext = new FormViewModel();
        
    }

but here you are trying to cast BindingContext as an Agenda

    async void SaveButtonClicked(object sender, EventArgs e)
    {
        
        var agenda = (Agenda)BindingContext;
       //agenda.Date = DateTime.UtcNow;
        await App.Database.SaveAgendaAsync(agenda);
        await Navigation.PopAsync();

    }