問題点
WPF のデータグリッドを利用していて、データグリッドの列に「カスタムコントロールの CheckBox」を利用しています。
このとき、チェックボックスを操作しても Binding が思った通り反応してくれません。
サンプルだと、チェックボックスを2つまとめた列が「カスタムコントロールの CheckBox」です。チェックボックスを変更しても「出力」にコードにある Console.WriteLine の内容が出力されていません。
備考
この現象は、前の記事で書いた「DataGridCell の TextBox だと KeyDown などのイベントが発生しない」と似たような問題です。しかし、解決方法がすこし違ったやり方のほうがスマートだったのでメモした記事になります。
Binding を発生させるための対策
対応するプロパティに UpdateSourceTrigger=PropertyChanged
を設定します。
今回のサンプルだと2つのチェックボックスは IsChecked1
と IsChecked2
です。
<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 が正常に動作するようになります。
サンプル
テストプログラムは GitHub の「Samples」に公開しています。今回のプログラムは「DataGridCustomCheckBoxTest」です。
参考
C#WPFの道【XAMLに慣れる編】: WindowsFormsプログラマーがWPFを書く方法
- 作者:ピーコックアンダーソン
- 発売日: 2019/02/04
- メディア: Kindle版
- 作者:ピーコックアンダーソン
- 発売日: 2020/04/29
- メディア: Kindle版