読者です 読者をやめる 読者になる 読者になる

VB.NETで作る!

VB.NETに関するあれこれ

ビジネスアプリ視点でみた WPF 3.0~4.5

ビジネスアプリという視点で.NET Frramework のどのバージョンを選んだら何ができるかをざっくりまとめます。無論、本命は最新バージョンの.NET4.5です。

各バージョンのざっくり説明

WPF 3.0

WPFアプリケーションが開発できるようになった最初のバージョン。

初回バージョンだけあって必要最低限の機能しかない印象。特にDataGridコントロールが存在しないのは致命的で、ビジネスアプリには当然向いてません。

WPF 3.5

Windows Presentation Foundation Version 3.5 の新機能

バインディング時、書式(カンマ区切り、日付の記号)の指定が可能(BindingBase.StringFormat プロパティ (System.Windows.Data))になる。

ただし、いまだDataGridコントロールがないという状況。Extended WPF Toolkit™ Community Edition - Home をインストールすればDataGridが利用可能にはなる。

ビジネスアプリの開発が可能な最低限のレベルにはなったと思いますが、あえて選ぶ必要はなし。

WPF 4

WPF Version 4 の新機能

待望のDataGridコントロールが標準で提供される。素晴らしい!

実務では使ったことないですが、MVVM Light Toolkit は.NET4 から使えるらしい。(MVVM Light Toolkit - Home

十分開発運用に耐えうると思いますが、Prismは使えない。

WPF 4.5

WPF Version 4.5 の新機能

本命なので少し詳しく。

INotifyPropertyChanged の実装が楽

BindableBaseクラスを使用できるようになり、INotifyPropertyChanged インターフェイスの実装が楽になる。といっても、Prism などのMVVMフレームワークいれている場合は特に恩恵なし。

Prism が利用できる

Prism MVVM フレームワークが使用可能になる。(Prismを選んだ理由はこちらをご参照ください。)

DIコンテナも利用できる

WPFガーではないですが、Dependency Injection(依存関係注入)コンテナであるUnityが使えるようになる。(3DゲームエンジンのUnityではないです

Binding時にDelayを指定できるようになる

BindingBase.Delay プロパティ (System.Windows.Data) が使えるようになるのですが、これが利用できる利点を背景を含めてちょっと説明。

バインディングする場合、UpdateSourceTriggerは主に「PropertyChanged」か「LostFocus」のいずれかを使うことが多いです。イベントの発生タイミングはその名の通り、「プロパティが変わったか」、「フォーカスを失ったか」になるわけですが、テキストボックスのテキストプロパティにバインディングする場合…

「PropertyChanged」だと打鍵のたび*1にイベントが走り、過剰。Setterに処理があった場合、当然過剰にコールされます。「Setterに処理なんか書かない」なんて思うかもしれませんが、MVVMで実装した場合、SetterにPropertyChangedEvent発火処理を埋め込むのが避けられません。PropertyChangedEventが発火されるとICommandインターフェイスのCanExecute メソッドが自動で発火されますので、過剰な発火はできれば避けたい。

「LostFocus」なら打鍵だけではイベントが起きないので、無駄な発火は起きません。ただ、Ctrl+Sショートカットキーで保存実行できるようにした場合などは、ロストフォーカスが起きずに処理が走る抜け道ができてしまうので、これを防ぐのは結構面倒。*2

このように、痛し痒しな状況があるわけですが、今回の「Delay」プロパティ登場のおかげでこれらが解決しました。記述例を見てみましょう。

<TextBox Text="{Binding EntityText, UpdateSourceTrigger=PropertyChanged, Delay=500}" />

このように書くことで、500msec以内にテキストボックスに打鍵した場合、イベントを発火しないようになります。何msecが適切かはわかりませんけれども、打鍵した内容を確認するのに通常は数秒かけると思いますので、よっぽど変な値を入れない限りは実害ないでしょう。

*1:変換前の打鍵ではイベントは走りませんが、数値入力欄の場合は打鍵時にイベントは走ってしまう。

*2:そもそも100%防げるのか不明

. .