sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

WPF DataGrid 内にあるカスタムチェックボックスの Binding が反応しない

問題点

WPF のデータグリッドを利用していて、データグリッドの列に「カスタムコントロールの CheckBox」を利用しています。

このとき、チェックボックスを操作しても Binding が思った通り反応してくれません。

f:id:shikaku_sh:20200528144429g:plain:w500
Binding が機能していない

サンプルだと、チェックボックスを2つまとめた列が「カスタムコントロールの CheckBox」です。チェックボックスを変更しても「出力」にコードにある Console.WriteLine の内容が出力されていません。

備考

この現象は、前の記事で書いた「DataGridCell の TextBox だと KeyDown などのイベントが発生しない」と似たような問題です。しかし、解決方法がすこし違ったやり方のほうがスマートだったのでメモした記事になります。

Binding を発生させるための対策

対応するプロパティに UpdateSourceTrigger=PropertyChanged を設定します。

今回のサンプルだと2つのチェックボックスIsChecked1IsChecked2 です。

<DataGrid AutoGenerateColumns="False" SelectionMode="Extended"
            CanUserResizeRows="False" CanUserSortColumns="False" CanUserDeleteRows="False" CanUserAddRows="False"
            HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
            ItemsSource="{Binding Samples}">
    <DataGrid.Columns>
        <DataGridTextColumn Width="Auto" MinWidth="50" Header="ID" Binding="{Binding No}" />
        <DataGridTextColumn Width="Auto" MinWidth="100" Header="テキスト" Binding="{Binding Text}" />

        <DataGridTemplateColumn Width="Auto" MinWidth="150"
                                Header="カスタムチェックボックス">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <local:TwoCheckBox IsChecked1="{Binding Data1, UpdateSourceTrigger=PropertyChanged}" 
                                       IsChecked2="{Binding Data2, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

これだけで Binding が正常に動作するようになります。

f:id:shikaku_sh:20200528144504g:plain:w500
Binding が機能してる

サンプル

テストプログラムは GitHub の「Samples」に公開しています。今回のプログラムは「DataGridCustomCheckBoxTest」です。

参考