WPF バージョン 4.5 の新機能
このトピックには、Windows Presentation Foundation (WPF) バージョン 4.5 の新機能と強化された機能に関する情報が含まれています。
このトピックには、次のセクションが含まれています。
グループ化されたデータ の大規模なセットを表示するときのパフォーマンスが向上しました
VirtualizingPanel の新機能
データ を同期的および非同期的に検証する
データ バインディング のソースを自動的に更新する
ICustomTypeProvider を実装する型へのバインド
バインド式 からデータ バインディング情報を取得する
イベント への弱い参照を確立するためのサポートが改善されました
リボン コントロール
WPF 4.5 には、クイック アクセス ツール バー、アプリケーション メニュー、タブをホストする Ribbon コントロールが付属しています。 詳細については、「リボンの概要」を参照してください。
グループ化されたデータの大規模なセットを表示するときのパフォーマンスが向上しました
UI 仮想化は、画面に表示される項目に基づいて、より多くのデータ項目からユーザー インターフェイス (UI) 要素のサブセットが生成されるときに発生します。 VirtualizingPanel は、グループ化されたデータの UI 仮想化を有効にする IsVirtualizingWhenGrouping 添付プロパティを定義します。 データのグループ化の詳細については、「方法: XAML でビューを使用してデータを並べ替え、グループ化する」を参照してください。 グループ化されたデータの仮想化の詳細については、IsVirtualizingWhenGrouping 添付プロパティを参照してください。
VirtualizingPanel の新機能
VirtualizingStackPanelなどの VirtualizingPanelが、ScrollUnit 添付プロパティを使用して部分的な項目を表示するかどうかを指定できます。 ScrollUnit が Itemに設定されている場合、VirtualizingPanel には完全に表示される項目のみが表示されます。 ScrollUnit が Pixelに設定されている場合、VirtualizingPanel は部分的に表示される項目を表示できます。
VirtualizingPanel の仮想化時に、CacheLength 添付プロパティを使用して、ビューポートの前後にキャッシュのサイズを指定できます。 キャッシュは、項目が仮想化されていないビューポートの上または下の領域の量です。 キャッシュを使用して、UI 要素がビューにスクロールされると生成されないようにすると、パフォーマンスが向上する可能性があります。 操作中にアプリケーションが応答しなくなることがないように、キャッシュは低い優先順位で設定されます。 VirtualizingPanel.CacheLengthUnit プロパティは、VirtualizingPanel.CacheLengthで使用される測定単位を決定します。
静的プロパティへのバインド
静的プロパティは、データ バインディングのソースとして使用できます。 静的イベントが発生した場合、データ バインディング エンジンはプロパティの値が変更されたときに認識します。 たとえば、クラス SomeClass
MyProperty
という静的プロパティを定義 SomeClass
、MyProperty
の値が変更されたときに発生する静的イベントを定義できます。 静的イベントでは、次のいずれかのシグネチャを使用できます。
public static event EventHandler MyPropertyChanged;
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
最初のケースでは、イベント ハンドラーに StaticPropertyChanged
という名前の静的イベントを公開します。 静的プロパティを実装するクラスは、いずれかのメソッドを使用してプロパティ変更通知を生成することを選択できます。
UI 以外のスレッドでのコレクションへのアクセス
WPF を使用すると、コレクションを作成したスレッド以外のスレッド上のデータ コレクションにアクセスして変更できます。 これにより、バックグラウンド スレッドを使用して、データベースなどの外部ソースからデータを受信し、UI スレッドにデータを表示できます。 別のスレッドを使用してコレクションを変更することで、ユーザー インターフェイスはユーザーの操作に対する応答性を維持します。
同期的および非同期的にデータを検証する
INotifyDataErrorInfo インターフェイスを使用すると、データ エンティティ クラスでカスタム検証規則を実装し、検証結果を非同期的に公開できます。 このインターフェイスでは、カスタム エラー オブジェクト、プロパティごとに複数のエラー、クロスプロパティ エラー、エンティティ レベルのエラーもサポートされます。 詳細については、INotifyDataErrorInfoを参照してください。
データ バインディングのソースを自動的に更新する
データ バインディングを使用してデータ ソースを更新する場合は、Delay プロパティを使用して、ソースの更新前にターゲットでプロパティが変更された後に渡す時間を指定できます。 たとえば、Value プロパティ データがデータ オブジェクトのプロパティに双方向でバインドされ、UpdateSourceTrigger プロパティが PropertyChangedに設定されている Slider があるとします。 この例では、ユーザーが Sliderを移動すると、Slider が移動するピクセルごとにソースが更新されます。 通常、ソース オブジェクトには、スライダーの Value の変更が停止した場合にのみ、スライダーの値が必要です。 ソースの更新が頻繁に行われるのを防ぐには、Delay を使用して、サムの移動が停止した後に一定の時間が経過するまでソースを更新しないように指定します。
ICustomTypeProvider を実装する型へのバインド
WPF では、カスタム型とも呼ばれる ICustomTypeProviderを実装するオブジェクトへのデータ バインディングがサポートされています。 カスタム型は、次の場合に使用できます。
データ バインディング内の PropertyPath として。 たとえば、Binding の Path プロパティは、カスタム型のプロパティを参照できます。
DataType プロパティの値として指定します。
DataGridで自動的に生成される列を決定する型として。
バインディング式からのデータバインディング情報の取得
場合によっては、Binding の BindingExpression が取得され、バインディングのソース オブジェクトとターゲット オブジェクトに関する情報が必要になる場合があります。 ソース オブジェクトまたはターゲット オブジェクト、または関連付けられているプロパティを取得できるように、新しい API が追加されました。 BindingExpressionがある場合は、次の API を使用して、ターゲットとソースに関する情報を取得します。
バインディングのこの値を検索するには | この API を使用する |
---|---|
ターゲット オブジェクト | BindingExpressionBase.Target |
ターゲット プロパティ | BindingExpressionBase.TargetProperty |
ソース オブジェクト | BindingExpression.ResolvedSource |
ソース プロパティ | BindingExpression.ResolvedSourcePropertyName |
BindingExpression が BindingGroup に属しているかどうか | BindingExpressionBase.BindingGroup |
BindingGroup の所有者 | Owner |
有効な DataContext オブジェクトの確認
ItemsControl 内の項目コンテナーの DataContext が切断される場合があります。 項目コンテナーは、ItemsControl内の項目を表示する UI 要素です。 ItemsControl がコレクションにバインドされたデータである場合、項目ごとに項目コンテナーが生成されます。 場合によっては、項目コンテナーがビジュアル ツリーから削除されます。 項目コンテナーが削除される一般的な 2 つのケースは、基になるコレクションから項目が削除されたときと、ItemsControlで仮想化が有効になっている場合です。 このような場合、項目コンテナーの DataContext プロパティは、BindingOperations.DisconnectedSource 静的プロパティによって返される sentinel オブジェクトに設定されます。 項目コンテナーの DataContext にアクセスする前に、DataContext が DisconnectedSource オブジェクトと等しいかどうかを確認する必要があります。
データの値の変化に応じてデータの位置を変更する (ライブ シェイプ)
データのコレクションは、グループ化、並べ替え、またはフィルター処理できます。 WPF 4.5 では、データが変更されたときにデータを再配置できます。 たとえば、アプリケーションが DataGrid を使用して株式市場の株式を一覧表示し、その株式を株価で並べ替えたとします。 株式の CollectionViewでライブソートが有効になっている場合、株式の価値が別の株式の価値より大きいか小さいとき、DataGrid における株式の位置が移動します。 詳細については、ICollectionViewLiveShaping インターフェイスを参照してください。
イベントへの弱い参照を確立するためのサポートの強化
イベントのサブスクライバーが追加のインターフェイスを実装しなくてもイベントに参加できるため、弱いイベント パターンの実装が簡単になりました。 ジェネリック WeakEventManager クラスを使用すると、サブスクライバーは、特定のイベントに対して専用の WeakEventManager が存在しない場合に、弱いイベント パターンに参加することもできます。 詳細については、「弱いイベント パターン
Dispatcher クラスの新しいメソッド
Dispatcher クラスは、同期操作と非同期操作の新しいメソッドを定義します。 同期 Invoke メソッドは、Action または Func<TResult> パラメーターを受け取るオーバーロードを定義します。 新しい非同期メソッド InvokeAsyncは、コールバック パラメーターとして Action または Func<TResult> も受け取り、DispatcherOperation または DispatcherOperation<TResult>を返します。 DispatcherOperation クラスと DispatcherOperation<TResult> クラスは、Task プロパティを定義します。 InvokeAsyncを呼び出すときは、await
キーワードを DispatcherOperation または Taskに関連付けて使用できます。 DispatcherOperation または DispatcherOperation<TResult>によって返される Task を同期的に待機する必要がある場合は、DispatcherOperationWait 拡張メソッドを呼び出します。 Task.Wait を呼び出すと、呼び出し元のスレッドで操作がキューに登録されている場合、デッドロックが発生します。 Task を使用して非同期操作を実行する方法の詳細については、「Task Parallelism (Task Parallel Library)」を参照してください。
イベントのマークアップ拡張機能
WPF 4.5 では、イベントのマークアップ拡張がサポートされています。 WPF では、イベントに使用するマークアップ拡張機能は定義されていませんが、サード パーティは、イベントで使用できるマークアップ拡張機能を作成できます。
関連項目
.NET Desktop feedback