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" にしててもデータソースに更新されません。