トップ回答者
WPFのDataGridで行ごとに別々のComboBoxを表示する方法

質問
-
WPFのDataGridで、DataGridComboBoxColumnなどを使用して以下のようなインタフェースを実現することは可能でしょうか。
ICollectionViewのFilterを使用して実現できないか試してみたのですが、はずかしながらWPFの知識が足りないため、うまく実現できず、質問させて頂いている次第です。
もし具体的な実現方法をご存知の方がいらっしゃいましたら、お手数ですが、ご教授頂けると大変助かります。
以下、実現したいインタフェースのイメージです。★DataGridの表示イメージ ※(CODE)は非表示項目ID (CODE) Combo1 Combo2
----------------------------
1 OK 正常 確認済み
2 NG 異常 数量誤り
3 None
4 NG 異常 商品誤り・Combo1列は、CODE列の値に合わせて初期表示する
・Combo2列は、Combo1列の選択値に合わせて初期表示する
・Combo2列は、Combo1列が変更されたら、未選択状態とする
・行レベルで選択し、複数行の同時選択は不可とする★DataGridに対する操作と結果のイメージ操作1:Combo1列のセルをタップ
結果1:CODE列の値に応じて以下のようなドロップダウンリストを表示CODE列=OKの場合
正常
正常A
正常B
異常
その他CODE列=NGの場合
正常A
異常
その他CODE列=Noneの場合
※ドロップダウン表示させない操作2:上記のドロップダウンで選択値を変更
結果2:選択された値に応じてCODE列の値を更新、かつ
Combo2列を未選択状態に更新操作3:Combo2列のセルをタップ
結果3:Combo1列(またはCODE列)の値に応じて以下のようなドロップダウンリストを表示Combo1列=正常の場合
確認済み
その他Combo1列=異常の場合
商品誤り
数量誤り
その他Combo1列=空白(空欄)の場合
※ドロップダウン表示させない
回答
-
「wpfのdatagridで動的にcomboboxに表示されるリストを切り替えたい」は参考になりますか?
選択している行番号によってリストを切り替えと書いてあるあたりで、CODE列を参照してComboBoxのItemsSourceを入れ替えることになるでしょう。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月12日 0:44
- 回答としてマーク テクノデリック 2017年7月12日 2:06
すべての返信
-
「wpfのdatagridで動的にcomboboxに表示されるリストを切り替えたい」は参考になりますか?
選択している行番号によってリストを切り替えと書いてあるあたりで、CODE列を参照してComboBoxのItemsSourceを入れ替えることになるでしょう。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月12日 0:44
- 回答としてマーク テクノデリック 2017年7月12日 2:06
-
gekka様
おはようございます。
深夜にもかかわらず、さっそくの回答ありがとうございます。
ご教授いただいた記事ですが、とても参考になります。
探し方が下手なせいか、ご教授いただいた記事を見れていませんでしたが、やはり、コントロールを切り替える方法が選択肢のひとつなのですね。
記事の中で、やり方はいくつもある、とのことでしたが、差支えなければ、他の選択肢についても、ご教授いただけないでしょうか。お手すきの時にでも、ご返信頂ければ幸いです。
なお、コントロールを切り替える方法で、サンプルを組み、対処可能なことが確認でき次第、回答としてマークさせていただきたいと思いますので、よろしくお願いします。
-
gekka様
お世話になっております。
ご教授いただいた記事を参考にして、ほぼ思っていたとおりのインタフェースを実装することが可能なことを確認できました。本当にありがとうございました。
なお、当方ではMVVMパターンを使用していたため、コードビハンドは使用せず、以下のような構成で実装して確認しました。
ViewModel側:
・Combo1列とCombo2列に対応させるICollectionViewのプロパティを準備
・上記のプロパティのFilterにCODE列相当の値を参照したフィルタ条件を定義
・上記のFilterをリフレッシュする(refreshメソッドを実行する)コマンドを準備
View側:
・参考記事のように、DatagridへTextBlockとComboBoxを定義
・ComboBoxのItemsSourceには、ICollectionViewのプロパティをバインド
・DatagridのPreparingCellForEditイベントを契機にFilterリフレッシュコマンドを実行
取り急ぎ、以上です。