• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Bindowanie DataGrid ComboBox do właściwości (pojedyńczej) z Entity Framework

Object Storage Arubacloud
0 głosów
192 wizyt
pytanie zadane 30 maja 2018 w C# przez Duch003 Początkujący (440 p.)

Witam.

Krótko o aplikacji: jest to aplikacja do nauki języka angielskiego na zasadzie quizu. W aplikacji jest baza danych słów i baza danych kategorii.

Mam takowy problem:

W aplikacji którą piszę mam możliwość zarządzania bazą danych słów i kategorii. Baza danych CF Entity Framework. Tak wygląda schemat bazy:

using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace ClickEnglish
{
    class DictionaryContext : DbContext
    {
        public DictionaryContext() : base("Dictionary")
        {
            Database.SetInitializer<DictionaryContext>(new DropCreateDatabaseIfModelChanges<DictionaryContext>());
        }

        public DbSet<Word> Dictionary { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<UserSettings> UserSettings { get; set; }
    }

    public class Word : IQuestion
    {
        [Key]
        public int ID { get; set; }
        [Required]
        public string English { get; set; }
        [Required]
        public string Polish { get; set; }
        public Category Category { get; set; }
        public double Difficulty { get; set; }
        public byte[] Picture { get; set; }
    }

    public class Category
    {
        [Key]
        public int ID { get; set; }
        public string Name { get; set; }

        public ICollection<Word> Words { get; set; }
    }

    public class UserSettings
    {
        [Key]
        public int ID { get; set; }
        public bool Sound { get; set; }
        public int TimeChallange { get; set; }
        public int VocabularySize { get; set; }
    }
}

Edytowanie bazy odbywa się w datagridzie, jednak mam problem z podpięciem klasy Category. Moim zamiarem jest aby wyświetlało się to w postaci ComboBoxa, tak aby do każdego zestawu słów można było przyporządkować kategorię lub ją zmienić. Niestety kategorie nie wyświetlają się w ogóle datagridzie.

1. Jaki musiałbym zrobić binding aby przy ładowaniu danych wyświetlała się też kategoria dla danych wyrazów?

2. Czy mogę jakoś bezpośrednio mieć podpiętą listę kategorii (w sensie, bez pobierania jej i konwertowania na listę string) tak abym mógł "na żywo" zmieniać kategorie?

Kod WPF:

<Window x:Class="ClickEnglish.DictionaryManager"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ClickEnglish"
        mc:Ignorable="d" Loaded="OnLoad"
        Title="DictionaryManager" Height="600" Width="800">

	<Window.Resources>
		<ResourceDictionary>
			<ResourceDictionary.MergedDictionaries>
				<ResourceDictionary Source="Style.xaml"/>
			</ResourceDictionary.MergedDictionaries>
		</ResourceDictionary>
	</Window.Resources>

	<Window.Background>
		<ImageBrush ImageSource="background/DictionaryManager_Background.jpeg"/>
	</Window.Background>
	
	<Grid>
		<Grid.RowDefinitions>
			<RowDefinition Height="*"/>
			<RowDefinition Height="*"/>
			<RowDefinition Height="Auto"/>
		</Grid.RowDefinitions>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="*"/>
			<ColumnDefinition Width="*"/>
			<ColumnDefinition Width="Auto"/>
		</Grid.ColumnDefinitions>
		<!--Datagrid with dictionary-->
		<DataGrid x:Name="dgDictionary"  Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="2" Opacity="0.7" AutoGenerateColumns="False"
				  Margin="10" PreviewKeyDown="KeyPreview" CellEditEnding="EditDictionary_End" BeginningEdit="EditDictionary_Begin">
			<DataGrid.Columns>
				<DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
				<DataGridTextColumn Header="English" Binding="{Binding English}"></DataGridTextColumn>
				<DataGridTextColumn Header="Polish" Binding="{Binding Polish}"></DataGridTextColumn>
				<DataGridComboBoxColumn x:Name="dgCbxCategories" Header="Category" DisplayMemberPath="Name" SelectedItemBinding="{Binding Category}"></DataGridComboBoxColumn>
				<DataGridTextColumn Header="Difficulty" Binding="{Binding Difficulty}"></DataGridTextColumn>
				<DataGridTemplateColumn Header="Picture">
					<DataGridTemplateColumn.CellTemplate>
						<DataTemplate>
							<Image Source="{Binding Picture}" Stretch="Fill" MaxWidth="200" MinWidth="200">
								<Image.ContextMenu>
									<ContextMenu>
										<MenuItem Header="Remove picture" Click="ClearPicture"/>
									</ContextMenu>
								</Image.ContextMenu>
							</Image>
						</DataTemplate>
					</DataGridTemplateColumn.CellTemplate>
					
				</DataGridTemplateColumn>
			</DataGrid.Columns>

		</DataGrid>

		<!--Buttons and searcher-->
		<WrapPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center">
			<!--Searcher-->
			<TextBox x:Name="txtSearcher" Grid.Row="0" Grid.Column="0" Margin="5" TextChanged="Searcher_TextChanged" MinWidth="255" MaxHeight="40"/>
			<!--Add new word-->
			<Button Style="{StaticResource Button_TileStyle}" Height="60" Margin="10" FontFamily="Kristen ITC" FontSize="20" Click="AddWord_Click">
				<TextBlock TextWrapping="WrapWithOverflow" Text="Add new" HorizontalAlignment="Center" TextAlignment="Center" VerticalAlignment="Center"/>
			</Button>
			<!--Remove-->
			<Button Style="{StaticResource Button_TileStyle}" Height="60" Margin="10" FontFamily="Kristen ITC" FontSize="20" Click="RemoveWord_Click">
				<TextBlock TextWrapping="WrapWithOverflow" Text="Remove selected" HorizontalAlignment="Center" TextAlignment="Center" VerticalAlignment="Center"/>
			</Button>
			<!--Exit-->
			<Button  Style="{StaticResource Button_TileStyle}" Height="60" Margin="10" FontFamily="Kristen ITC" FontSize="20" Click="Exit_Click">
				<TextBlock TextWrapping="WrapWithOverflow" Text="Exit" HorizontalAlignment="Center" TextAlignment="Center" VerticalAlignment="Center"/>
			</Button>
		</WrapPanel>
	</Grid>
	
</Window>

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 478 wizyt
0 głosów
1 odpowiedź 956 wizyt
pytanie zadane 11 marca 2017 w C# przez PejtaM Użytkownik (550 p.)
0 głosów
1 odpowiedź 716 wizyt
pytanie zadane 1 grudnia 2018 w C# przez marcinconn Obywatel (1,560 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...