WPFの DataGrid で値が更新された時に何かの処理をしたい事があると思います。
TextBox の TextChanged イベントのようなものが DataGrid でも必要というケースです。
ここでは DataGrid で値が更新された時のイベントを利用する方法について解説します。
SourceUpdatedイベント
DataGrid は SourceUpdatedというイベント持っています。
SourceUpdated イベントはコントロールが操作されたことでバインドされたデータが更新されるタイミングで呼び出されるイベントです。
(逆にバインドされたデータを更新した事でコントロールの表示が更新されるタイミングで呼び出されるTargetUpdatedというイベントもあります)
まずはこの SourceUpdated イベントを実装しましょう。
<DataGrid SourceUpdated="DataGrid_SourceUpdated" />
だたし、これだけではイベントが呼び出されません。
以下の設定も必要です。
更新の通知を許可する
データバインディングの仕組みを担当する Bindingクラスは NotifyOnSourceUpdated というプロパティを持っています。このプロパティの値に True をセットする事で SourceUpdagted イベントが発生するようになります。
DataGridの各カラムに対してNotifyOnSourceUpdated プロパティをセットしましょう。
<DataGrid SourceUpdated="DataGrid_SourceUpdated" > <DataGridTextColumn Header="項目1" Binding="{Binding Path=x, NotifyOnSourceUpdated=True}"/> <DataGridTextColumn Header="項目2" Binding="{Binding Path=y, NotifyOnSourceUpdated=True}"/> </DataGrid>
更新の通知タイミングを指定する
Bindingクラスは UpdateSourceTrigger というプロパティを持っています。
これはどのタイミングで更新通知が発生するかを指定するものです。
設定できる値は以下の通りです。
- PropertyChanged ・・・ 値が更新される時
- LostFocus ・・・ フォーカスを失った時
- Explicit ・・・ 明示的にUpdateSource()メソッドを呼び出した時
<DataGrid SourceUpdated="DataGrid_SourceUpdated" > <DataGridTextColumn Header="項目1" Binding="{Binding Path=x, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}}"/> <DataGridTextColumn Header="項目2" Binding="{Binding Path=y, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}}"/> </DataGrid>
コメントをお書きください
oono hideki (木曜日, 06 1月 2022 09:48)
データグリッドの行追加、セル編集のタイミングを探していてたどり着きました
別なページでは「SourceUpdated」しか書かれておらず各列に対する更新の通知を許可、タイミングのことが書いておらず悩んでいました。
大変参考になりました。