No more Death March

あるSEのチラシの裏 C# WPF

WPF TextBlockのTextChangedイベント

TextBlockにはTextChangedというイベントは無いのだけど変更されたタイミングを知る方法はある。検索すれば色々やり方が出てくるけどいくつか種類があるので要点をメモ

TargetUpdatedイベントを使う

TargetUpdateイベントはバインディングのターゲットが更新された時に着火するイベント、BindingのオプションにあるNotifyTargetUpdatedにtrueを指定する必要がある。イベント引数の中を探ればどのプロパティをターゲットにしたバインディングが更新されたかを知ることが出来る。おそらく検索すると一番最初に目に付くかと思うが、TargetUpdateイベントの中でプロパティを判定しなければいけないところが余り好きじゃない。

PropertyDescriptorを使う

PropertyDescriptorというstaticクラスにあるAddValueChangedにイベントハンドラーを登録し変更通知を受け取ってやる。ちゃんと登録を解除してやらないとメモリリークするか。

依存関係プロパティを作成し、変更通知を受け取りたいプロパティをバインディングする

自分が使うことが多いのはこのやり方、ビヘイビアの中にstring型の添付プロパティを作成しTextBlockのTextプロパティをソースにバインディングしてやる。


どの方法を採用すべきかはお好みで、TextBlockのTextプロパティに限らず、TextBoxのIsReadOnlyやCanvasのLeftなんかも〇〇Changedといったイベントが用意されていないので、応用出来る。地味だけど重宝するテクニックです。