概要
ComboBoxにバインドします。
そして、ComboBoxの選択に応じてTextBoxの値を変更します。
ComboBoxのプロパティ「IsSynchronizedWithCurrentItem」を「True」にして、ComboBoxとTextBoxのバインド先を一緒にするのがミソ。
ビュー、コード
ビュー XAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<Window x:Class="ComboBindTest.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:ComboBindTest" mc:Ignorable="d" Title="MainWindow" Height="189.909" Width="283.945"> <Grid> <StackPanel> <ComboBox x:Name="comboBox1" Margin="10,10,10,10" SelectedValuePath="ID" DisplayMemberPath="Proj" SelectedIndex="0"/> <!--連動させたいので、「IsSynchronizedWithCurrentItem="True"」を設定--> <ComboBox x:Name="comboBox2" Margin="10,10,10,0" SelectedValuePath="ID" DisplayMemberPath="Proj" IsSynchronizedWithCurrentItem="True"/> <TextBox x:Name="textBox" Margin="10,10,10,0" Text="{Binding Path=Start}"/> </StackPanel> </Grid> </Window> |
コード (MainWindow.xaml.cs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
using System.Windows; using System.ComponentModel; using System.Collections.ObjectModel; namespace ComboBindTest { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // ObservableCollectionのインスタンス"vmCollection"にアイテム追加 vmCollection.Add(new viewModel { ID = "1", Proj = "Proj_A", Start = "2021/10/10", End = "2021/10/11" }); vmCollection.Add(new viewModel { ID = "2", Proj = "Proj_B", Start = "2021/11/11", End = "2021/11/12" }); vmCollection.Add(new viewModel { ID = "3", Proj = "Proj_C", Start = "2021/12/12", End = "2021/12/13" }); // comboBox1のItemSorceを設定 comboBox1.ItemsSource = vmCollection; // comboBox2とtextboxのItemSorceを設定 // comboBox2を変更すると、連動してtextBoxの値も変わります。 comboBox2.ItemsSource = vmCollection; textBox.DataContext = vmCollection; } // ObservableCollectionをインスタンス化 private ObservableCollection<viewModel> vmCollection = new ObservableCollection<viewModel>(); // コンボボックス用のViewModel public class viewModel : INotifyPropertyChanged { // プロパティを変更すると通知が発生するようにPropertyChangedEventHandlerを設定 public event PropertyChangedEventHandler PropertyChanged; private void RisePropertyChanged(string propertyName) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string _ID; public string ID { get { return _ID; } set { _ID = value; RisePropertyChanged(nameof(ID)); } } private string _Proj; public string Proj { get { return _Proj; } set { _Proj = value; RisePropertyChanged(nameof(Proj)); } } private string _Start; public string Start { get { return _Start; } set { _Start = value; RisePropertyChanged(nameof(Start)); } } private string _End; public string End { get { return _End; } set { _End = value; RisePropertyChanged(nameof(End)); } } } } } |
補足
動作イメージ
combobox1を変更しても、textboxは変わりません。(“Proj_B”選択。textboxの値はProj_Aに対応したStartの値)
combobox1を変更しても、textboxは変わりません。(“Proj_C”選択。textboxの値はProj_Aに対応したStartの値)
combobox2を変更すると、textboxの値が連動して変わります。(“Proj_B”選択。textboxの値はProj_Bに対応したStartの値)
combobox2を変更すると、textboxの値が連動して変わります。(“Proj_C”選択。textboxの値はProj_Cに対応したStartの値)
そのほか
「IsSynchronizedWithCurrentItem=”True”」をcombobox1にも追記すると、combobox1, combobox2, textboxすべてが連動するようになります。
コメント