DataGrid にコンボボックスやチェックボックスを配置する場合、DataGridComboBoxColumn や DataGridCheckBoxColumn を使用するのが標準的な方法です。が、これだとメニュー表示するまでに、「セルを選択」→「編集モード移行」→「メニュー表示」、と3クリックを必要とします。 # なんでこんな仕様に…(汗
初期状態
1Click 目
2Click 目
3Click 目
![]()
DataGrid の仕様として、「セルを選択の後、再度クリックすると編集モードになり、そこから…」ということのようなので、そうなるのは理解できるとしても、操作感としては「面倒」以外何物もないわけです。
チェックボックスも同様で、チェックの On/Off をするのに 2Click を必要とします。
これを「セルを選択と同時にメニューを表示したい」場合、DataGridComboBoxColumn の使用は諦めて、DataGridTemplateColumn を構成するのが近道のようです。たとえば以下のような感じ。
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding DataGridItems}">
<DataGrid.Columns>
<!-- コンボボックス側 -->
<DataGridTemplateColumn IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Choice,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
VerticalContentAlignment="Center">
<ComboBox.Items>
<System:String>あああ</System:String>
<System:String>いいい</System:String>
<System:String>ううう</System:String>
</ComboBox.Items>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- チェックボックス側 -->
<DataGridTemplateColumn IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Check, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
ポイントは、Binding の際に UpdateSourceTrigger を設定してすること。
"UpdateSourceTrigger=LostFocus" でも "UpdateSourceTrigger=PropertyChanged" でもどちらでもよいですが、適切なものを設定します。
でないとデフォルトは "UpdateSourceTrigger=Explicit" 相当の動きとなってしまうようなので、"Mode=TwoWay" にしててもデータソースに更新されません。


