I'm programming a personal mobile app in c# xamarin in order to save password (eg : social network / mail / game / online purchase etc...). I have an issue to display the data in the DB into the listview, it is always blank. My goal is when I click on a menuitem from a flyoutpage, only the data from the menuitem pushed display on the listview. the object in the menuitem (category about the password) match with my tables in the DB.
here some pictures to better understand The page after the login page flyoutmenuitem
I know a flyoutpage has a navigationPage method and it is using to go on a new page, but is it possible to do all my operations in the FlyoutPageDetail or do I need to create new pages and do all my stuff in these new pages ?
When i debug step by step and I click on a category, I'm go to the good method (Listview_ItemSelected(object sender, SelectedItemChangedEventArgs e)
here my code about my different pages DataDisplay C#
`public partial class DataDisplay : FlyoutPage
{
public DataDisplay()
{
InitializeComponent();
FlyoutPage.ListView.ItemSelected += ListView_ItemSelected;
}
private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var selectedCategory = e.SelectedItem as DataDisplayFlyoutMenuItem;
if (selectedCategory == null)
{
return;
}
DataBase dbConnexion = new DataBase();
switch (selectedCategory.Title)
{
case "Administratif":
var getDataAdmin = dbConnexion.GetAdministratifData();
var result = getDataAdmin.Result;
GetDataDB getDataDB = new GetDataDB();
getDataDB.GetDataFromDB = new List<GetDataDB>();
foreach (var data in result)
{
GetDataDB.GetDataFromDB.Add(new GetDataDB { Titre = data.Titre, Login = data.Login, Password = data.Password, Url = data.Url });
}
break;
case "Ecommerce":
break;
case "Jeux":
break;
case "Mail":
break;
case "Reseauxsociaux":
break;
}
IsPresented = false;
FlyoutPage.ListView.SelectedItem = null;
}
}`
DataDisplay XAML
`<?xml version="1.0" encoding="utf-8" ?>
<FlyoutPage xmlns="schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="schemas.microsoft.com/winfx/2009/xaml"
x:Class="MemoDePasse.DataDisplay"
xmlns:pages="clr-namespace:MemoDePasse">
<FlyoutPage.Flyout>
<pages:DataDisplayFlyout x:Name="FlyoutPage" />
</FlyoutPage.Flyout>
<FlyoutPage.Detail>
<NavigationPage>
<x:Arguments>
<pages:DataDisplayDetail />
</x:Arguments>
</NavigationPage>
</FlyoutPage.Detail>
</FlyoutPage>`
DataDisplayDetail C#
`public partial class DataDisplayDetail : ContentPage
{
public DataDisplayDetail()
{
InitializeComponent();
BindingContext = new GetDataDB();
}
public void BtnClickGoAddingDataPage(object sender, EventArgs e)
{
Navigation.PushModalAsync(new AddingDataPage());
}
}`
DataDisplayDetail XAML
`<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="schemas.microsoft.com/winfx/2009/xaml"
x:Class="MemoDePasse.DataDisplayDetail"
xmlns:local="clr-namespace:MemoDePasse"
x:DataType="local:GetDataDB"
Title="Catégories">
<StackLayout>
<ListView
x:Name="ListViewData"
SeparatorVisibility="Default"
SeparatorColor="Black"
ItemsSource="{Binding GetDataFromDB}">
<ListView.Header>
<Grid
BackgroundColor="LightGray"
IsEnabled="True"
IsVisible="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label
Grid.Column="0"
Text="Titre"
FontAttributes="Bold"
FontSize="Default"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"/>
<Label
Grid.Column="1"
Text="Login"
FontAttributes="Bold"
FontSize="Default"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"/>
<Label
Grid.Column="2"
Text="Mot de passe"
FontAttributes="Bold"
FontSize="Default"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"/>
<Label
Grid.Column="3"
Text="URL"
FontAttributes="Bold"
FontSize="Default"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"/>
</Grid>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Column="0" Text="{Binding Titre}"/>
<Label Grid.Column="1" Text="{Binding Login}"/>
<Label Grid.Column="2" Text="{Binding Password}"/>
<Label Grid.Column="3" Text="{Binding Url}"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid VerticalOptions="End">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button
x:Name="Add"
Grid.Column="0"
Text="Ajouter"
BackgroundColor="Green"
Clicked="BtnClickGoAddingDataPage"/>
<Button
x:Name="Update"
Grid.Column="1"
Text="Modifier"
BackgroundColor="BlueViolet"/>
<Button
x:Name="Delete"
Grid.Column="2"
Text="Supprimer"
BackgroundColor="Red"/>
</Grid>
</StackLayout>
</ContentPage>`
DataDisplayFlyout C#
`public partial class DataDisplayFlyout : ContentPage
{
public ListView ListView;
public DataDisplayFlyout()
{
InitializeComponent();
BindingContext = new FlyoutPage1FlyoutViewModel();
ListView = MenuItemsListView;
}
class FlyoutPage1FlyoutViewModel : INotifyPropertyChanged
{
public ObservableCollection<DataDisplayFlyoutMenuItem> MenuItems { get; set; }
public FlyoutPage1FlyoutViewModel()
{
MenuItems = new ObservableCollection<DataDisplayFlyoutMenuItem>(new[]
{
new DataDisplayFlyoutMenuItem { Id = 0, Title = "Administratif" },
new DataDisplayFlyoutMenuItem { Id = 1, Title = "Ecommerce" },
new DataDisplayFlyoutMenuItem { Id = 2, Title = "Jeux" },
new DataDisplayFlyoutMenuItem { Id = 3, Title = "Mail" },
new DataDisplayFlyoutMenuItem { Id = 4, Title = "Reseauxsociaux" },
});
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged == null)
return;
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}`
DataDisplayFlyout XAML
`<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="schemas.microsoft.com/winfx/2009/xaml"
x:Class="MemoDePasse.DataDisplayFlyout"
Title="Flyout">
<StackLayout>
<ListView x:Name="MenuItemsListView" SeparatorVisibility="None" HasUnevenRows="true" ItemsSource="{Binding MenuItems}">
<ListView.Header>
<Grid BackgroundColor="#03A9F4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="80"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<Label Grid.Column="1" Grid.Row="1" Text="Catégories" Style="{DynamicResource SubtitleStyle}"/>
</Grid>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="15,10" HorizontalOptions="FillAndExpand">
<Label VerticalOptions="FillAndExpand" VerticalTextAlignment="Center" Text="{Binding Title}" FontSize="15"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>`
GetDataDB C# (this is the binding source for my listview with the property GetDataFromDB)
`public class GetDataDB
{
public string Titre { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string Url { get; set; }
public IList<GetDataDB> GetDataFromDB { get; set; }
public GetDataDB()
{
}
}`
If you want more details, please tell me.
I thank you in advance. Best Regards.
I solved this problem but in a different way.