WPF Version 4.5 の新機能

このトピックでは、Windows Presentation Foundation (WPF) Version 4.5 の新機能および拡張機能について説明します。

このトピックは、次のセクションで構成されています。

リボン コントロール

WPF 4.5 には、クイック アクセス ツール バー、アプリケーション メニュー、タブをホストする Ribbon コントロールが付属しています。 詳細については、「リボンの概要」を参照してください。

グループ化された大きなデータ セットを表示する際のパフォーマンスが向上

UI の仮想化は、ユーザー インターフェイス (UI) 要素のサブセットが画面上に表示する項目に基づいて、より多くのデータ項目から生成されるときに行われます。 VirtualizingPanel は、グループ化されたデータの UI の仮想化を有効にする IsVirtualizingWhenGrouping 添付プロパティを定義します。 データのグループ化の詳細については、「方法:XAML でビューを使用してデータの並べ替えおよびグループ化を行う」を参照してください。 グループ化されたデータの仮想化の詳細については、IsVirtualizingWhenGrouping 添付プロパティを参照してください。

VirtualizingPanel の新機能

  1. VirtualizingPanel 添付プロパティを指定することで、VirtualizingStackPanel (ScrollUnit など) に部分的な項目を表示するかどうかを指定できます。 ScrollUnitItem に設定されている場合、VirtualizingPanel には完全に表示される項目だけが表示されます。 ScrollUnitPixel に設定されている場合、VirtualizingPanel には部分的に表示される項目も表示されます。

  2. CacheLength 添付プロパティを使用して VirtualizingPanel を仮想化すると、ビューポートの前後でキャッシュのサイズを指定できます。 キャッシュは、項目が仮想化されないビューポートの上または下の領域の量です。 キャッシュを使用して、UI 要素がビューにスクロールされたときに UI 要素が生成されないようすると、パフォーマンスが向上します。 キャッシュは、操作中にアプリケーションが応答を停止しないように低い優先度で実行されます。 VirtualizingPanel.CacheLengthUnit プロパティは、VirtualizingPanel.CacheLength により使用される測定単位を決定します。

静的プロパティへのバインド

データ バインディングのソースとして静的プロパティを使用できます。 データ バインディング エンジンは、静的イベントが発生した場合にプロパティの値が変更されたことを認識します。 たとえば、SomeClass クラスが MyProperty という静的プロパティを定義している場合、SomeClassMyProperty の値が変更されたときに発生する静的イベントを定義できます。 静的イベントは、次のいずれかのシグネチャを使用できます。

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

最初のケースでは、イベント ハンドラーに EventArgs を渡す PropertyNameChanged という名前の静的イベントがクラスにより公開されています。 2 番目のケースでは、イベント ハンドラーに StaticPropertyChanged を渡す PropertyChangedEventArgs という名前の静的イベントがクラスにより公開されています。 静的プロパティを実装するクラスは、いずれかの方法を使用してプロパティ変更通知を生成することを選択できます。

非 UI スレッドでのコレクションへのアクセス

WPF により、コレクションで作成されたスレッド以外のスレッドでデータ コレクションにアクセスして変更することが可能になります。 このため、バックグラウンド スレッドを使用して、データベースなどの外部ソースからデータを受信し、UI スレッドにデータを表示することができます。 別のスレッドを使用してコレクションを変更することで、ユーザー インターフェイスはユーザー操作への応答を維持します。

データの同期および非同期検証

INotifyDataErrorInfo インターフェイスにより、データ エンティティ クラスは、ユーザー定義の検証規則を実装し、検証結果を非同期的に公開することができます。 このインターフェイスは、カスタム エラー オブジェクト、プロパティごとの複数のエラー、プロパティ間のエラー、およびエンティティ レベルのエラーもサポートします。 詳細については、「INotifyDataErrorInfo」を参照してください。

データ バインディングのソースの自動更新

データ バインディングを使用してデータ ソースを更新する場合、Delay プロパティを使用して、ターゲットでプロパティが変更されてからソースが更新されるまでの時間の長さを指定できます。 たとえば、Slider プロパティ データがデータ オブジェクトのプロパティに双方向にバインドされた Value があり、UpdateSourceTrigger プロパティが PropertyChanged に設定されているとします。 この例では、ユーザーが Slider を移動すると、Slider が移動する各ピクセルのソースが更新されます。 Value が変更を停止した場合、ソース オブジェクトには通常スライダーの値のみ必要です。 ソースがあまり頻繁に更新されないようにするには、Delay を使用して、Thumb が移動を停止してから一定の時間が経過するまでソースが更新されないように指定します。

ICustomTypeProvider を実装する型へのバインド

WPF では、ICustomTypeProvider を実装するオブジェクトへのデータ バインディングがサポートされます (カスタムの型とも呼ばれます)。 カスタムの型は、次の場合に使用できます。

  1. データ バインディングにおける PropertyPath として。 たとえば、PathBinding プロパティは、カスタムの型のプロパティを参照できます。

  2. DataType プロパティの値として。

  3. DataGrid で自動的に生成された列を決定する型として。

バインディング式からのデータ バインディング情報の取得

場合によっては、BindingExpressionBinding を取得することがあり、バインディングのソースとターゲットのオブジェクトに関する情報を必要となる可能性があります。 ソースまたはターゲットのオブジェクトや関連プロパティを取得できるように、新しい API が追加されました。 BindingExpression がある場合、次の API を使用してターゲットおよびソースに関する情報を取得します。

検出するバインディングの値 使用する API
ターゲット オブジェクト BindingExpressionBase.Target
ターゲット プロパティ BindingExpressionBase.TargetProperty
ソース オブジェクト BindingExpression.ResolvedSource
ソース プロパティ BindingExpression.ResolvedSourcePropertyName
BindingExpressionBindingGroup に属するかどうか BindingExpressionBase.BindingGroup
BindingGroup の所有者 Owner

有効な DataContext オブジェクトの確認

DataContext にある項目のコンテナーの ItemsControl が切断されるケースがあります。 項目コンテナーは、ItemsControl に項目を表示する UI 要素です。 ItemsControl がコレクションにバインドされたデータの場合、項目コンテナーは項目ごとに生成されます。 場合によっては、項目コンテナーがビジュアル ツリーから削除されます。 項目コンテナーが削除される 2 つの一般的なケースは、項目が基になるコレクションから削除されたときと、仮想化が ItemsControl で有効になっているときです。 このような場合、項目コンテナーの DataContext プロパティは、BindingOperations.DisconnectedSource の静的プロパティから返されるオブジェクトのセンティネル オブジェクトに設定されます。 項目コンテナーの DataContext にアクセスする前に、DisconnectedSourceDataContext オブジェクトと等しいかどうかを確認する必要があります。

データの値変更に伴うデータの再配置 (ライブ形成)

データのコレクションは、グループ化、並べ替え、またはフィルター処理が可能です。 WPF 4.5 により、データが変更されたときの再配置が可能になります。 たとえば、アプリケーションが DataGrid を使用して株式市場の株式を一覧表示し、株式が株価によって並べ替えられるとします。 株式の CollectionView でライブ並べ替えが有効な場合、株式が別の株式の価格を上回るか下回ると、DataGrid における株式の位置が移動します。 詳細については、ICollectionViewLiveShaping インターフェイスのトピックを参照してください。

イベントへの弱い参照確立のサポート強化

追加のインターフェイスを実装しなくてもイベントへのサブスクライバーがイベントに参加できるため、弱いパターンの実装が簡単になりました。 一般的な WeakEventManager クラスでは、専用の WeakEventManager が特定のイベントに存在しない場合は、サブスクライバーが弱いイベント パターンにも参加できるようになりました。 詳細については、「弱いイベント パターン」を参照してください。

ディスパッチャー クラスの新しいメソッド

ディスパッチャー クラスは、同期操作および非同期操作の新しいメソッドを定義します。 同期メソッドである Invoke は、Action パラメーターまたは Func<TResult> パラメーターを受け取るオーバーロードを定義します。 新しい非同期メソッドである InvokeAsyncは、コールバック パラメーターとして ActionFunc<TResult> を受け取り、DispatcherOperationDispatcherOperation<TResult> を返します。 DispatcherOperation クラスと DispatcherOperation<TResult> クラスは、Task プロパティを定義します。 InvokeAsync を呼び出すと、await または関連付けられた DispatcherOperationTask を持つキーワードを使用できます。 Task または DispatcherOperation によって返される DispatcherOperation<TResult> を同期的に待機する必要がある場合、DispatcherOperationWait 拡張メソッドを呼び出します。 Task.Wait を呼び出すと、呼び出し元スレッドで操作がキューに置かれた場合はデッドロックが発生します。 Task を使用して非同期操作を実行する方法の詳細については、「タスクの並列化 (タスク並列ライブラリ)」を参照してください。

イベントのマークアップ拡張機能

WPF 4.5 では、イベントのマークアップ拡張機能がサポートされます。 WPF はイベントに使用されるマークアップ拡張機能を定義しませんが、サードパーティがイベントで使用できるマークアップ拡張機能を作成できます。

関連項目