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

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

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

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

Q&A

解決済

1回答

8433閲覧

WPF DataGrid内のComboBoxの表示が消える

attach

総合スコア12

C#

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

0グッド

0クリップ

投稿2017/06/19 06:56

###前提・実現したいこと
WPFのDataGrid内にコンボボックスを設定。
SelectionChangedイベントを発生させるためDataGridTemplateColumn内に
ComboBoxを設定しております。

###発生している問題・エラーメッセージ
グリッドが複数行ある場合スクロールするとコンボボックスに
設定した内容が消えてしまう。

###該当のソースコード

<DataGridTemplateColumn Header="項目" CanUserReorder="True" CanUserResize="True" CanUserSort="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ComboBox Name="cbID" VerticalContentAlignment="Center" ItemsSource="{Binding _ITEMS, Mode =TwoWay, UpdateSourceTrigger=PropertyChanged}" Loaded="cbSetID_Loaded" SelectionChanged="cbSetID_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock><Run Text="["/><Run Text="{Binding ID}"/><Run Text="]"/><Run Text="{Binding 名称}"/></TextBlock> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
C# .net FrameWork4.6.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

cbSetID_Loaded内で何をやっているかわかりませんが、Loadedのイベントですのでスクロールして行が表示されるたびにイベントが発生していると思います。そこで初期化されているのでは?

投稿2017/06/19 07:58

ebiryo

総合スコア797

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

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

attach

2017/06/19 08:10

cbSetID_LoadedおよびSelectionChangedイベント削除して呼び出さないようにxamlを変更しましたが同様に設定したコンボボックスの内容が初期化されてしまうようです。
ebiryo

2017/06/19 08:17

「設定したコンボボックスの内容」というのはドロップダウンのリストの中身のことですか?それともコンボボックスが現在選択してる項目のことですか?
attach

2017/06/19 08:28

言葉足らずですみません。 コンボボックスが現在選択してる項目が非選択状態となります。
ebiryo

2017/06/19 09:28 編集

DataGridは仮想化されています。そのためコンボボックスの選択内容をどこにも保持しておかないと、非表示になった行が再度表示されたとき選択内容が初期化されているのだと思います。 これを回避するには以下のようにコンボボックスのSelectedItemをPropertyChangedのタイミングでどこかに保持するか <ComboBox Name="cbID" ItemsSource="{Binding _ITEMS}" SelectedItem="{Binding path=Selectd,UpdateSourceTrigger=PropertyChanged}"> もしくは以下のようにDataGridの仮想化をやめればよい思います ⇒この方法はお勧めしません。。。 <DataGrid Name="dataGrid" .... VirtualizingPanel.IsVirtualizing="False">
attach

2017/06/19 09:35

ご回答ありがとうございます。 ご指摘の通りVirtualizingStackPanel.VirtualizationMode ="Standard"とすることで 初期化が解除することができました。 再度質問で申し訳ございません。DataGridの仮想化しない方法をお勧めしない理由としては 速度的なことでしょうか。
ebiryo

2017/06/19 09:43

はい、パフォーマンスに関することが一番の問題かと思います。ですので行数が少ないのあれば構わないとは思いますが。。 
attach

2017/06/19 09:47

上記承知いたしました。 勉強になります。 多々ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問