[WPF][XAML] DataGrid の コンボボックスやチェックボックス を 1クリックで操作する

2013年12月15日

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






カテゴリー: Program, WPF, xaml

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org