質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

5406閲覧

C#でCheckBoxのIsCheckedとComboBoxの選択状態をBindingしたい

Q12

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/02/26 06:05

こんにちは。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/02/26 11:10

何がしたいのかよくわかりませんが、カップルを作るものですか? もしそうなら要件が不十分だと思います。
Q12

2019/02/27 02:00

カップルとは何でしょうか?
Zuishin

2019/02/27 02:19

二人組のことです。 要するに双方向リストか単方向リストかどちらにでも取れるので、詳細な仕様を開示するか、それによって何を実現しようとしているかを伝えなければ、思ったものと違う回答や大雑把な回答がつきやすくなるでしょう。
Q12

2019/02/27 04:15

セレクタでの選択でチェックボックスをチェックしたいので、単方向です。 チェックボックスの選択状態を変更してもセレクタは変更しません。 これで足りるでしょうか?
Zuishin

2019/02/27 04:18 編集

別のものを選択したときにどうなるかとか、ラジオボタンじゃいけないのかとか、詳細というのは一言で説明するものではありません。それは概略です。
Zuishin

2019/02/27 04:21

その概略レベルの質問だと kiichi54321 さんの回答で十分と私は考えます。
Q12

2019/02/27 05:23

別のものを選択したときにはチェックボックスの状態は変更してもしなくてもいいです。でも別のを選択したときにチェックが消えて、別のチェックがつくとよりよいかも。 ラジオボタンでもよいです。表示面積の問題があり、ComboBoxを使っています。
Zuishin

2019/02/27 06:01

つまりこれはユーザーに順位をつけさせているのですか? 一つのリストボックスに項目を並べてドラッグで移動するのではいけませんか?
Q12

2019/02/27 06:28

順位をつけたりはしないです。 たとえば選択した履歴をとっているようなものです。 やりたいのはBindingでのセレクタとチェックボックスの連携なので、リストボックスのドラッグとかはいまのところ関係なさそうです。
Zuishin

2019/02/27 07:09

これで履歴がとれますか? 小出しでなく、質問を編集してちゃんと詳細に説明してほしいのですが、無理ならやめます。
Zuishin

2019/02/27 07:10

履歴だけ聞いているのではありませんし、イエス・ノーで答えを聞いているのでもありません。 念のため。
Zuishin

2019/02/27 07:10

聞かれたことだけ小出しでなくというところが重要です。
Q12

2019/02/27 07:54

たとえば、といっただけで履歴をとりたいわけではないです。 小出しにもしていないです。 このコードは動作します。そのうえで、セレクタの選択とチェックボックスのチェック状態を連動したい。それ以上でも以下でもないのですが…。
Zuishin

2019/02/27 08:44 編集

では ViewModel と View を作り、StackPanel をやめて ListBox または ListView にし、Model の IsSelected と CheckBox の IsChecked をバインドし、ComboBox の入っている方の ListBox の ComboBoxItem にスタイルを適用し、そこで IsSelected と Model にバインドすれば連動します。
Zuishin

2019/02/27 08:45

これで確かに連動します。それ以上でもそれ以下でもありません。 間違いなく連動します。連動は。
Q12

2019/02/27 09:20

StackPanel をやめて ListBox または ListView にする。->ListBoxにしました。 Model の IsSelected->IsChecked? と CheckBox の IsChecked をバインドする。?方法をコードで教えてください。 ComboBox の入っている方の ListBox の ComboBoxItem にスタイルを適用する。?方法をコードで教えてください。 そこで IsSelected と Model にバインドすれば連動します。?方法をコードで教えてください。
Zuishin

2019/02/27 09:25

多分あなたは「これじゃない」と言います。
guest

回答1

0

いろいろとツッコミどころがあるけど、
ViewModelで、基本的に、Viewのクラスを扱いません。

ObservableCollection<CheckBox>

がありえない。

public class Member { public string Name{get;set;} public bool IsChecked{get;set;} }

みたいなクラスを作って、
そのObservableCollectionをViewModelで抱えるようにしてください。

投稿2019/02/26 06:30

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q12

2019/02/26 07:26

もう少し細かくかみ砕いてお願いします。 MemberはViewModelですか? Modelですか? INotifyPropertyChangedを継承しますか? AddCheckBoxes()はViewにするのですか? なにとなにをBindingするのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問