none
WPFのDataGridで行ごとに別々のComboBoxを表示する方法 RRS feed

  • 質問

  • 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列=空白(空欄)の場合
      ※ドロップダウン表示させない

    2017年7月11日 15:16

回答

すべての返信

  • wpfのdatagridで動的にcomboboxに表示されるリストを切り替えたい」は参考になりますか?

    選択している行番号によってリストを切り替えと書いてあるあたりで、CODE列を参照してComboBoxのItemsSourceを入れ替えることになるでしょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年7月11日 15:36
  • gekka様

    おはようございます。

    深夜にもかかわらず、さっそくの回答ありがとうございます。

    ご教授いただいた記事ですが、とても参考になります。

    探し方が下手なせいか、ご教授いただいた記事を見れていませんでしたが、やはり、コントロールを切り替える方法が選択肢のひとつなのですね。

    記事の中で、やり方はいくつもある、とのことでしたが、差支えなければ、他の選択肢についても、ご教授いただけないでしょうか。お手すきの時にでも、ご返信頂ければ幸いです。

    なお、コントロールを切り替える方法で、サンプルを組み、対処可能なことが確認でき次第、回答としてマークさせていただきたいと思いますので、よろしくお願いします。

    2017年7月11日 23:26
  • gekka様

    お世話になっております。

    ご教授いただいた記事を参考にして、ほぼ思っていたとおりのインタフェースを実装することが可能なことを確認できました。本当にありがとうございました。

    なお、当方ではMVVMパターンを使用していたため、コードビハンドは使用せず、以下のような構成で実装して確認しました。

    ViewModel側:

    ・Combo1列とCombo2列に対応させるICollectionViewのプロパティを準備

    ・上記のプロパティのFilterにCODE列相当の値を参照したフィルタ条件を定義

    ・上記のFilterをリフレッシュする(refreshメソッドを実行する)コマンドを準備

    View側:

    ・参考記事のように、DatagridへTextBlockとComboBoxを定義

    ・ComboBoxのItemsSourceには、ICollectionViewのプロパティをバインド

    ・DatagridのPreparingCellForEditイベントを契機にFilterリフレッシュコマンドを実行

    取り急ぎ、以上です。

    2017年7月12日 2:22