前提
環境
- Visual Studio Community 2017
- Microsoft SQL Server 2017 Express
- Entity Framework (データベースファースト開発)
- .NET 4.7
- WPF
現在、行っている方法
- EFで生成した、CategoryをToListにして、ComboBox.ItemsSourceにセットすることで、名前の表示、IDの取得はできています。
- Personレコードを表示する時は、PersonのCategoryIDを、ComboBoxにセット( ソースの ■1)
- Personレコードを登録する時は、ComboBoxのSelectedValueを取得して、表示しているPersonレコードのCategoryIDにセットしています(ソースの ■2)。
データベースには、Personテーブルと、Categoryテーブルがあります。
また、データベースから、モデルを作成してあります。
Categoryには、次のようにレコードを登録してあります。
行いたいこと
行いたいことは、Comboboxで、選択した値を自動的に連動することです。
TextBoxでは、{Binding CategoryID}されているので、テキストボックスに数値を入力すれば、後は、context.SaveChanges();で、データベースに登録されます。同様に、Comboboxでも、Binding か何かで、Person.CategoryIDに該当する名前を表示し、名前を選択した場合は、その値が自動的にcontextに反映されて、context.SaveChanges()で保存できないか、いろいろ調べましたが分かりませんでした。
連動させれば、■1と■2の部分は不要になると思います。
なにか、適切な方法はないでしょうか?
実行画面
XAMLのComboBoxと、TextBox部分
lang
1<ComboBox x:Name="comboTest" HorizontalAlignment="Left" Margin="168,55,0,0" VerticalAlignment="Top" Width="120"/> 2 3<TextBox x:Name="categoryIDTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding CategoryID, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/>
該当のソースコード
lang
1namespace ComboTest 2{ 3 4 public partial class MainWindow : Window 5 { 6 TestDBEntities context = new TestDBEntities(); 7 CollectionViewSource personViewSource; 8 9 public MainWindow() 10 { 11 InitializeComponent(); 12 personViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("personViewSource"))); 13 14 } 15 16 private void Window_Loaded(object sender, RoutedEventArgs e) 17 { 18 19 context.People.Load(); 20 context.Categories.Load(); 21 22 // ここではPersonのID1を表示 23 var query = from item in context.People 24 where item.ID == 1 25 select item; 26 27 personViewSource.Source = query.ToList(); 28 29 Person p = query.First(); 30 31 // ComboBoxにソースをセット 32 var cList = context.Categories.ToList(); 33 comboTest.ItemsSource = cList; 34 comboTest.DisplayMemberPath = "名前"; 35 comboTest.SelectedValuePath = "ID"; 36 37 // ■1 ComboBoxに表示する値をセットする。 38 comboTest.SelectedValue = p.CategoryID; 39 40 } 41 42 private void Button_Click(object sender, RoutedEventArgs e) 43 { 44 45 // ■2 ComboBoxの値を反映させる 46 Person p = context.People.Where(x => x.ID == 1).First(); 47 p.CategoryID = (int)comboTest.SelectedValue; 48 49 50 51 context.SaveChanges(); 52 } 53 } 54} 55
補足
lang
1<Window x:Class="ComboTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:ComboTest" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="572.14" Loaded="Window_Loaded"> 9 <Window.Resources> 10 <CollectionViewSource x:Key="personViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Person}, CreateList=True}"/> 11 </Window.Resources> 12 <Grid> 13 <Grid x:Name="grid1" DataContext="{StaticResource personViewSource}" HorizontalAlignment="Left" Margin="302,96,0,0" VerticalAlignment="Top"> 14 <Grid.ColumnDefinitions> 15 <ColumnDefinition Width="Auto"/> 16 <ColumnDefinition/> 17 </Grid.ColumnDefinitions> 18 <Grid.RowDefinitions> 19 <RowDefinition Height="Auto"/> 20 </Grid.RowDefinitions> 21 </Grid> 22 <Grid x:Name="grid2" DataContext="{StaticResource personViewSource}" HorizontalAlignment="Left" Margin="127,176,0,0" VerticalAlignment="Top"> 23 <Grid.ColumnDefinitions> 24 <ColumnDefinition Width="Auto"/> 25 <ColumnDefinition Width="Auto"/> 26 </Grid.ColumnDefinitions> 27 <Grid.RowDefinitions> 28 <RowDefinition Height="Auto"/> 29 </Grid.RowDefinitions> 30 <Label Content="名前:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/> 31 <TextBox x:Name="名前TextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding 名前, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/> 32 </Grid> 33 <ComboBox x:Name="comboTest" HorizontalAlignment="Left" Margin="168,55,0,0" VerticalAlignment="Top" Width="120"/> 34 35 36 <Grid x:Name="grid3" DataContext="{StaticResource personViewSource}" HorizontalAlignment="Left" Margin="86,140,0,0" VerticalAlignment="Top"> 37 <Grid.ColumnDefinitions> 38 <ColumnDefinition Width="Auto"/> 39 <ColumnDefinition Width="Auto"/> 40 </Grid.ColumnDefinitions> 41 <Grid.RowDefinitions> 42 <RowDefinition Height="Auto"/> 43 </Grid.RowDefinitions> 44 <Label Content="Category ID:" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/> 45 <TextBox x:Name="categoryIDTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding CategoryID, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/> 46 </Grid> 47 <Button Content="登録" HorizontalAlignment="Left" Margin="174,231,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 48 <TextBlock HorizontalAlignment="Left" Margin="298,144,0,0" TextWrapping="Wrap" Text="バインドされている。" VerticalAlignment="Top" Height="23" Width="117"/> 49 <TextBlock HorizontalAlignment="Left" Margin="302,56,0,0" TextWrapping="Wrap" Text="バインドされていない。" VerticalAlignment="Top" Height="23" Width="122"/> 50 51 </Grid> 52</Window>
CollectionViewSourceの自動生成
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/29 06:47
2018/05/29 08:02
2018/05/29 08:18
2018/05/29 14:36