Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Diskuze: WPF combobox na odkazovanou tabulku, zobrazení názvu místo ID

C# .NET .NET (C# a Visual Basic) WPF combobox na odkazovanou tabulku, zobrazení názvu místo ID American English version English version

Aktivity (3)
Avatar
Ghst
Člen
Avatar
Ghst:5. října 13:44

Ahoj,

potýkám se s takovým pro někoho asi banálním problémem, ale nedokázal jsem ho vyřešit.

Ve WPF píši aplikaci s pomocí EF na evidenci dat.

Pro zjednodušení mám 2 tabulky - Auta a Modely, Auto má Id, spz a FK_modelId. Modely mají Id a název.

Data zobrazuji v datagridu, ve sloupečku FK_ModelId bych rád zobrazil název modelu namísto ID.

Našel jsem řešení, které zobrazuje správně, ale problém je ten, ale je to asi špatně, nějakým způsobem se propojí zdroje dat.

To se projeví tak, že pokud vyberu v autech z comba položku, označí se příslušná v tabulce modelů. Pokud přidám nový model, v tabulce aut, bude aktuálně označenému záznamu změněna vazba ze stávajícího modelu na nově přidaný.

1 Obrázek psuštění aplikace - 1. řádek auta má model caroq
2 Obrázek - dojde k přidání nového modelu test, po uložení je tento nově přidaný model přiřazen k autu, kde byl nastaven caroq, toto je nechtěná funkce

obrazky

Předpokládám, že chyba je v combu,

<ComboBox Grid.Column="1" HorizontalAlignment="Left" Height="Auto" Margin="3" Grid.Row="1" VerticalAlignment="Center" Width="120"
                            x:Name="fK_ModelIdComboBox"
                            IsEditable="True"
                            IsTextSearchEnabled="True"
                            IsTextSearchCaseSensitive="False"
                            TextSearch.TextPath="Název"
                            ItemsSource="{Binding Source={StaticResource modelViewSource}}"
                            SelectedValuePath="Id"
                            SelectedValue="{Binding Path=FK_ModelId}"
                            IsSynchronizedWithCurrentItem="True"
                            IsReadOnly="False">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <Run Text="{Binding Název}" />
                        </TextBlock>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

Celý kód:

<Window x:Class="Test.MainWindow"
        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:Test"
        mc:Ignorable="d"
        Title="MainWindow" Height="640" Width="840" Loaded="Window_Loaded">
    <Window.Resources>
        <CollectionViewSource x:Key="autaViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Auta}, CreateList=True}"/>
        <CollectionViewSource x:Key="modelViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Model}, CreateList=True}"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource autaViewSource}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <DataGrid x:Name="autaDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="0,20,16,389" Grid.RowSpan="3" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="idColumn" Binding="{Binding Id}" Header="Id" Width="20"/>
                <DataGridTextColumn x:Name="spzColumn" Binding="{Binding Spz}" Header="Spz" Width="80"/>
                <DataGridTemplateColumn x:Name="datumRegistraceColumn" Header="Datum Registrace" Width="140">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding DatumRegistrace, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <!--<DataGridTextColumn x:Name="fK_ModelIdColumn" Binding="{Binding FK_ModelId}" Header="FK Model Id" Width="150"/>-->
                <DataGridTemplateColumn x:Name="fK_ModelIdColumn" Header="Model" Width="140">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Path=Model.Název}"/>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>
        </DataGrid>
        <DataGrid x:Name="modelDataGrid" AutoGenerateColumns="False" Grid.Column="1" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource modelViewSource}}" Margin="6,25,10,384" Grid.RowSpan="3" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="idColumn1" Binding="{Binding Id}" Header="Id" Width="SizeToHeader"/>
                <DataGridTextColumn x:Name="názevColumn" Binding="{Binding Název}" Header="Název" Width="250"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="saveBtn" Content="Save" HorizontalAlignment="Left" Margin="323,388,0,0" Grid.Row="2" VerticalAlignment="Top" Width="148" Click="saveBtn_Click" Height="43" Grid.ColumnSpan="2"/>
        <Grid x:Name="grid1" HorizontalAlignment="Left" Margin="28,237,0,0" Grid.Row="2" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label Content="Datum Registrace:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/>
            <DatePicker x:Name="datumRegistraceDatePicker" Grid.Column="1" HorizontalAlignment="Left" Margin="3" Grid.Row="0" SelectedDate="{Binding DatumRegistrace, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center"/>
            <Label Content="FK Model Id:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="1" VerticalAlignment="Center"/>
            <!--<TextBox x:Name="fK_ModelIdTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="1" Text="{Binding FK_ModelId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>-->
            <ComboBox Grid.Column="1" HorizontalAlignment="Left" Height="Auto" Margin="3" Grid.Row="1" VerticalAlignment="Center" Width="120"
                            x:Name="fK_ModelIdComboBox"
                            IsEditable="True"
                            IsTextSearchEnabled="True"
                            IsTextSearchCaseSensitive="False"
                            TextSearch.TextPath="Název"
                            ItemsSource="{Binding Source={StaticResource modelViewSource}}"
                            SelectedValuePath="Id"
                            SelectedValue="{Binding Path=FK_ModelId}"
                            IsSynchronizedWithCurrentItem="True"
                            IsReadOnly="False">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <Run Text="{Binding Název}" />
                        </TextBlock>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

            <Label Content="Id:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="2" VerticalAlignment="Center"/>
            <TextBox x:Name="idTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="2" Text="{Binding Id, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
            <Label Content="Spz:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="3" VerticalAlignment="Center"/>
            <TextBox x:Name="spzTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="3" Text="{Binding Spz, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
        </Grid>
        <Grid x:Name="grid2" Grid.Column="1" DataContext="{StaticResource modelViewSource}" HorizontalAlignment="Left" Margin="51,240,0,0" Grid.Row="2" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label Content="Id:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/>
            <TextBox x:Name="idTextBox1" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding Id, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
            <Label Content="Název:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="1" VerticalAlignment="Center"/>
            <TextBox x:Name="názevTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="1" Text="{Binding Název, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
        </Grid>
        <Button x:Name="addCarBtn" Content="+ nové auto" HorizontalAlignment="Left" Margin="91,388,0,0" Grid.Row="2" VerticalAlignment="Top" Width="75" Click="button_Click"/>
        <Button x:Name="addModelBtn" Content="+ nový model" Grid.Column="1" HorizontalAlignment="Left" Margin="99,344,0,0" Grid.Row="2" VerticalAlignment="Top" Width="75" Click="addModelBtn_Click"/>
    </Grid>
</Window>

Zkusil jsem:

Chci docílit: Chci docílit, aby sem modl evidovat modely i automobili a jediné propojení bylo to, že u auta vyberu model z comba a ten přiřadím.

 
Odpovědět 5. října 13:44
Avatar
Ghst
Člen
Avatar
Ghst:5. října 22:12

Tak sem snad našel řešení...

IsSynchronizedWithCurrentItem="False"
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 5. října 22:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.