Возьмем проект из прошлой темы и добавим в него страницы и логику для манипуляции объектами из пользовательского интерфейса.
Для начала надо определить логику создания таблицы и определения подключения. Для этого перейдем в файл App.xaml.cs и изменим его конструктор следующим образом:
public static BookRepository repo; public App() { this.InitializeComponent(); this.Suspending += this.OnSuspending; repo = new BookRepository("library.db"); repo.CreateTable(); }
С помощью статической переменной BookRepository repo
мы будем обращаться к базе данных из любого места в приложении. В самом конструкторе
создается бд library.db
(если она отсутствует), а также таблица Book.
У нас уже есть стандартная страница MainPage.xaml. Пусть она будет выводить список книг. Определим в ней следующий код xaml:
<Page x:Class="SQLLiteApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:SQLLiteApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <StackPanel> <TextBlock Text="Библиотека" Style="{ThemeResource HeaderTextBlockStyle}" /> <ListView x:Name="booksList" IsItemClickEnabled="True" ItemClick="ItemView_ItemClick"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Name}" FontSize="26" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button x:Name="createButton" Content="Добавить" Click="createButton_Click" /> </StackPanel> </Grid> </Page>
Элементу ListView
задается шаблон для отображения связанных данных. По нажатию на каждый объект в списке выполняется обработчик
ItemView_ItemClick
. Также имеется кнопка для создания новых объектов.
А в файле кода MainPage.xaml.cs изменим код метода OnNavigatedTo
и добавим обработчики:
protected override void OnNavigatedTo(NavigationEventArgs e) { booksList.ItemsSource = App.repo.GetBooks(); } private void ItemView_ItemClick(object sender, ItemClickEventArgs e) { var itemId = ((Book)e.ClickedItem).Id; Frame.Navigate(typeof(DetailsPage), itemId); } private void createButton_Click(object sender, RoutedEventArgs e) { Frame.Navigate(typeof(AddPage)); }
Метод OnNavigatedTo()
, срабатывающий при переходе на страницу, будет загружать в список данные. Обработчик ItemView_ItemClick()
будет по нажатию на элемент списка передавать id объекта на страницу DetailsPage, которую сейчас создадим. А метод createButton_Click()
будет переходить
на страницу создания объекта AddPage.
Теперь добавим в проект новую страницу по типу Blank Page и назовем ее AddPage.xaml. Определим в ней следующую разметку:
<Page x:Class="SQLLiteApp.AddPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:SQLLiteApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <StackPanel> <TextBlock Text="Новый элемент" Style="{ThemeResource HeaderTextBlockStyle}" /> <TextBox x:Name="nameBox" PlaceholderText="Название" /> <TextBox x:Name="authorBox" PlaceholderText="Автор" /> <TextBox x:Name="yearBox" PlaceholderText="Год" /> <Button x:Name="addButton" Content="Добавить" Click="addButton_Click" /> </StackPanel> </Grid> </Page>
Здесь определены поля для заполнения. По клику на кнопку срабатывает обработчик addButton_Click
. Добавим для него код в файл
AddPage.xaml.cs:
private void addButton_Click(object sender, RoutedEventArgs e) { long year = -1; if(Int64.TryParse(yearBox.Text,out year) && !String.IsNullOrWhiteSpace(nameBox.Text) && !String.IsNullOrWhiteSpace(authorBox.Text)) { Book book = new Book { Name = nameBox.Text, Author = authorBox.Text, Year = year }; App.repo.Insert(book); if (Frame.CanGoBack) Frame.GoBack(); } }
Вначале проверяем поля, потом создаем объект Book и добавляем его в базу данных. В конце возвращаемся на предыдущую страницу.
И также добавим в проект новую станицу DetailsPage.xaml, которая будет выводить данные об объекте:
<Page x:Class="SQLLiteApp.DetailsPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:SQLLiteApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid x:Name="detailsGrid"> <StackPanel> <TextBlock Text="О книге" Style="{ThemeResource HeaderTextBlockStyle}" /> <TextBlock Text="Название" FontSize="21" Foreground="Silver" /> <TextBlock x:Name="nameBlock" FontSize="25" /> <TextBlock Text="Автор" FontSize="21" Foreground="Silver"/> <TextBlock x:Name="authorBlock" FontSize="25" /> <TextBlock Text="Год" FontSize="21" Foreground="Silver"/> <TextBlock x:Name="yearBlock" FontSize="25" /> <StackPanel Orientation="Horizontal"> <Button Content="Назад" Click="Button_Click" /> <Button x:Name="deleteButton" Content="Удалить" Click="Button_Click" IsEnabled="False" /> </StackPanel> </StackPanel> </Grid> </Page>
Здесь определены поля для отображения свойств объекта, а также две кнопки - для удаления и для возвращения назад. И в файл кода добавим обработчик для этих кнопок
и изменим метод OnNavigatedTo()
:
public long Id { get; set; } protected override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { long id = (long)e.Parameter; Book b = App.repo.GetBook(id); if(b!=null) { nameBlock.Text = b.Name; authorBlock.Text = b.Author; yearBlock.Text = b.Year.ToString(); deleteButton.IsEnabled = true; Id = id; } } } private void Button_Click(object sender, RoutedEventArgs e) { Button button = (Button)sender; if(button.Name=="deleteButton") App.repo.Delete(Id); if (Frame.CanGoBack) Frame.GoBack(); }
При переходе с главной страницы на DetailsPage в нее будет передаваться id выбранного объекта. Это id будет храниться в свойстве public long Id
.
По id получаем объект из бд и выводим все значения его свойств на страницу.
В обработчике кнопок, если была нажата кнопка удаления, то удаляем из бд, и затем переходим на предыдущую страницу.
При запуске приложения на главной странице будут отображаться все объекты из базы данных:
Перейдем на страницу добавления и добавим ряд объектов:
При нажатии на один объект из списка откроется страница с детальной информацией об объекте, где мы можем также его удалить.