こんにちは。
C#でCheckBoxのIsCheckedとComboBoxの選択状態をBindingしたいです。
なにとなにをBindongしたらよいのか混乱しています。
アドバイスいただければ幸いです。
前提・実現したいこと
C#の「コード」でCheckBoxのIsCheckedとComboBoxの選択状態をBindingしたいです。
白石麻衣をcomboboxで選択したときに、CheckBoxの白石麻衣のIsCheckedをtrueにしたいです。
可能であれば、ひとつのcomboboxで白石麻衣を選択すると、他のcomboboxでは白石麻衣を選択できなくしたいです。
コードで、というのは、コードのとおり、要素が可変のためです。
発生している問題・エラーメッセージ
なにとなにをBindongしたらよいのか混乱しています。
試したこと
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/data/how-to-create-a-binding-in-code
を読んでみましたが、いまいちピンときませんでした。
該当のソースコード
XAML
1<Window x:Class="CheckBoxBinding.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:CheckBoxBinding" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> 9 <Grid> 10 <Grid.ColumnDefinitions> 11 <ColumnDefinition Width="80*"/> 12 <ColumnDefinition Width="120*"/> 13 </Grid.ColumnDefinitions> 14 15 <StackPanel Grid.Column="0"> 16 <ItemsControl ItemsSource="{Binding Path=CheckBoxes}" /> 17 </StackPanel> 18 19 <StackPanel Grid.Column="1"> 20 <ItemsControl ItemsSource="{Binding Path=ComboBoxes}" /> 21 </StackPanel> 22 23 24 </Grid> 25</Window> 26
C#
1using System.Windows; 2 3namespace CheckBoxBinding 4{ 5 public partial class MainWindow : Window 6 { 7 MainWindowViewModel ViewModel = new MainWindowViewModel(); 8 9 public MainWindow() 10 { 11 InitializeComponent(); 12 DataContext = this.ViewModel; 13 } 14 15 private void Window_Loaded(object sender, RoutedEventArgs e) 16 { 17 ViewModel.AddCheckBoxes(); 18 ViewModel.AddSelectors(); 19 } 20 } 21}
C#
1using System.Collections.ObjectModel; 2using System.ComponentModel; 3using System.Windows.Controls; 4 5namespace CheckBoxBinding 6{ 7 public class MainWindowViewModel : INotifyPropertyChanged 8 { 9 public event PropertyChangedEventHandler PropertyChanged; 10 protected void OnPropertyChanged(string name) 11 { 12 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 13 } 14 15 private ObservableCollection<CheckBox> checkBoxes = new ObservableCollection<CheckBox>(); 16 public ObservableCollection<CheckBox> CheckBoxes 17 { 18 get 19 { 20 return checkBoxes; 21 } 22 set 23 { 24 checkBoxes = value; 25 OnPropertyChanged(nameof(CheckBoxes)); 26 } 27 } 28 29 private ObservableCollection<ComboBox> comboBoxes = new ObservableCollection<ComboBox>(); 30 public ObservableCollection<ComboBox> ComboBoxes 31 { 32 get 33 { 34 return comboBoxes; 35 } 36 set 37 { 38 comboBoxes = value; 39 OnPropertyChanged(nameof(ComboBoxes)); 40 } 41 } 42 43 public void AddCheckBoxes() 44 { 45 foreach (var member in 乃木坂46s) 46 { 47 var checkbox = new CheckBox() 48 { 49 Content = member, 50 //IsChecked=??なににBindingしたらよいでしょう? 51 }; 52 CheckBoxes.Add(checkbox); 53 } 54 } 55 56 public void AddSelectors() 57 { 58 for (int i = 0; i < 乃木坂46s.Length; i++) 59 { 60 var combobox = new ComboBox(); 61 foreach (var member in 乃木坂46s) 62 { 63 var selectitem = new ComboBoxItem() 64 { 65 Content = member, 66 //複数セレクタ間で要素を排他にするにはどうすればいいでしょう? 67 }; 68 combobox.Items.Add(selectitem); 69 } 70 ComboBoxes.Add(combobox); 71 } 72 } 73 74 string[] 乃木坂46s = new string[] { "西野七瀬", "白石麻衣", "秋元真夏", "堀未央奈", "齋藤飛鳥" }; 75 } 76}
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.9.2
VisualStudio.15.Release/15.9.2+28307.108
Microsoft .NET Framework
Version 4.7.03190
OS Microsoft Windows 10 Pro
SQLite System.Data.SQLite.Core v1.0.109.2