Работа со сложными данными

Последнее обновление: 26.11.2017

В прошлой теме мы рассмотрели работу с простой моделью Company, объекты которой хранятся в базе данных. Но у нас еще есть другая модель - Phone, которая связана с Company отношением "один-ко-многим". Рассмотрим вкратце, как мы можем работать и с этой моделью.

Для работы с моделью Phone добавим в проект новую страницу. Назовем ее PhonesListPage.xaml и установим у нее следующее содержимое:

<Page
    x:Class="SQLiteApp.PhonesListPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQLiteApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel>
            <TextBox Name="nameBox" PlaceholderText="Введите модель" Margin="10" />
            <TextBox Name="priceBox" PlaceholderText="Введите цену" Margin="10" />
            <ComboBox x:Name="companiesList" DisplayMemberPath="Name" SelectedValuePath="Id" 
					Margin="10" PlaceholderText="Выберите компанию" />
            <StackPanel Orientation="Horizontal">
                <Button Content="Добавить" Click="Add_Click" Margin="10" />
                <Button Content="Назад" Click="Back" Margin="10" />
            </StackPanel>
        </StackPanel>
        <ListView x:Name="phonesList" Grid.Row="1" Margin="10">
            <ListView.ItemTemplate>
                <DataTemplate  x:DataType="local:Phone">
                    <StackPanel>
                        <TextBlock FontSize="16" Text="{x:Bind Title}" FontWeight="Bold"  />
                        <TextBlock FontSize="16" Text="{x:Bind Company.Name}" />
                        <TextBlock FontSize="16" Text="{x:Bind Price}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

Сначала на странице идет набор полей для добавления нового объекта Phone. И под ними располагается элемент ListView, который выводит все добавленные объекты. Для упрощения примера добавление и вывод происходят на одной и той же страницу.

Также изменим код C# у страницы, чтобы добавлять объекты Phone и выводить их в списке:

using System;
using System.Collections.Generic;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Collections.ObjectModel;
using Microsoft.EntityFrameworkCore;

namespace SQLiteApp
{
    public sealed partial class PhonesListPage : Page
    {
        ObservableCollection<Phone> phones;
        List<Company> companies;
        public PhonesListPage()
        {
            this.InitializeComponent();

            this.Loaded += PhonesListPage_Loaded;
        }

        private void PhonesListPage_Loaded(object sender, RoutedEventArgs e)
        {
            using (MobileContext db = new MobileContext())
            {
                phones = new ObservableCollection<Phone>(db.Phones.Include(x => x.Company).ToList());
                companies = db.Companies.ToList();
            }

            companiesList.ItemsSource = companies;
            phonesList.ItemsSource = phones;
        }
		
		private void Back(object sender, RoutedEventArgs e)
        {
            if (Frame.CanGoBack) Frame.GoBack();
        }
		
        private void Add_Click(object sender, RoutedEventArgs e)
        {
            Company company = companiesList.SelectedItem as Company;
            if (company == null) return;

            // создаем объект Phone
            Phone phone = new Phone
            {
                Title = nameBox.Text,
                Price = Int32.Parse(priceBox.Text),
                Company = company
            };

            using(MobileContext db = new MobileContext())
            {
				db.Companies.Attach(company);
                db.Phones.Add(phone);
                if(db.SaveChanges() > 0)
				{
                    phones.Add(phone);
					// либо так
					//phonesList.ItemsSource = db.Phones.Include(x=>x.Company).ToList();				
				}
            }
        }
    }
}

При загрузке страницы мы получаем два списка - список телефонов для их отображения в ListView и список компаний для выпадающего списка ComboBox, чтобы при добавлении пользователь мог выбрать компанию.

В обработчике кнопки добавления создаем новый объект Phone по введенным в поля данным и добавляем его в базу данных. В общем-то тут добавление проходит также, как и добавление обычной модели. Только в данном случае нам надо еще установить внешний ключ на связанную модель Company с помощью свойства CompanyId.

В итоге страница будет выглядеть следующим образом:

Связь один ко многим в Entity Framework и UWP

И чтобы эту страницу можно было вызвать с главной, добавим в MainPage.xaml еще одну кнопку:

<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton x:Name="phonesListButton" Label="Телефоны" Icon="PhoneBook" Click="PhonesList_Click" />
        
		<!-- остальные кнопки-->
    </CommandBar>
</Page.BottomAppBar>

И определим для этой кнопки обработчик:

private void PhonesList_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(PhonesListPage));
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850