データ バインディングの概要Data Binding Overview

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) データ バインディングは、データを表示したり操作するための単純で一貫した方法をアプリケーションに提供します。 data binding provides a simple and consistent way for applications to present and interact with data. 要素は、共通言語ランタイム (CLR)common language runtime (CLR) オブジェクトおよび XMLXML の形式のさまざまなデータ ソースのデータにバインドできます。Elements can be bound to data from a variety of data sources in the form of 共通言語ランタイム (CLR)common language runtime (CLR) objects and XMLXML. ContentControlなどの sButtonItemsControlなど sListBoxListViewを 1 つのデータ項目の柔軟なスタイルまたはデータ項目のコレクションを有効にする機能が組み込まれました。ContentControls such as Button and ItemsControls such as ListBox and ListView have built-in functionality to enable flexible styling of single data items or collections of data items. 並べ替えビュー、フィルター ビュー、およびグループ ビューは、データの上に生成できます。Sort, filter, and group views can be generated on top of the data.

WPFWPF のデータ バインディング機能には、本質的にデータ バインディングをサポートする広範なプロパティ、データの柔軟な UIUI 表現、UIUI からのビジネス ロジックの明確な分離など、従来のモデルより優れた長所がいくつかありますThe data binding functionality in WPFWPF has several advantages over traditional models, including a broad range of properties that inherently support data binding, flexible UIUI representation of data, and clean separation of business logic from UIUI.

このトピックは最初に基本的な概念をについて説明WPFWPFデータのバインドとの使用状況をし、移動、Bindingクラスとデータ バインディングの他の機能です。This topic first discusses concepts fundamental to WPFWPF data binding and then goes into the usage of the Binding class and other features of data binding.

データ バインディングとはWhat Is Data Binding?

データ バインディングとは、アプリケーション UIUI とビジネス ロジックの間の接続を確立する処理です。Data binding is the process that establishes a connection between the application UIUI and business logic. バインドが適切に設定され、データから適切な通知が提供される場合、データの値が変更されると、そのデータにバインドされている要素に変更が自動的に反映されます。If the binding has the correct settings and the data provides the proper notifications, then, when the data changes its value, the elements that are bound to the data reflect changes automatically. データ バインディングには、要素内のデータの外部表現が変更された場合、基になるデータを自動的に更新して変更を反映できるという意味もあります。Data binding can also mean that if an outer representation of the data in an element changes, then the underlying data can be automatically updated to reflect the change. たとえば、ユーザーに値を編集する場合、TextBox要素、基になるデータ値が自動的にその変更を反映するように更新します。For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.

データ バインディングの一般的な使用は、サーバーまたはローカルの構成データをフォームまたはその他の UIUI コントロールに配置することです。A typical use of data binding is to place server or local configuration data into forms or other UIUI controls. WPFWPF では、この概念は幅広いプロパティのバインドからさまざまなデータ ソースまで拡張されます。In WPFWPF, this concept is expanded to include the binding of a broad range of properties to a variety of data sources. WPFWPF では、要素の依存関係プロパティは CLRCLR オブジェクト (ADO.NETADO.NET オブジェクトまたは Web サービスおよび Web のプロパティに関連付けられているオブジェクトを含む) および XMLXML データにバインドできます。In WPFWPF, dependency properties of elements can be bound to CLRCLR objects (including ADO.NETADO.NET objects or objects associated with Web Services and Web properties) and XMLXML data.

データ バインディングの例については、データ バインディング デモの次のアプリケーション UIUI を参照してください。For an example of data binding, take a look at the following application UIUI from the Data Binding Demo:

データ バインディングのサンプル スクリーン ショットData binding sample screen shot

上記は、オークション品目の一覧を表示するアプリケーションの UIUI です。The above is the UIUI of an application that displays a list of auction items. このアプリケーションは、データ バインディングの次の機能を示しています。The application demonstrates the following features of data binding:

  • 内容、ListBoxのコレクションにバインドされたAuctionItemオブジェクト。The content of the ListBox is bound to a collection of AuctionItem objects. AuctionItem オブジェクトには、DescriptionStartPriceStartDateCategorySpecialFeatures などのプロパティがあります。An AuctionItem object has properties such as Description, StartPrice, StartDate, Category, SpecialFeatures, etc.

  • データ (AuctionItemオブジェクト) に表示される、ListBoxがテンプレート化されて、説明と、現在の価格を項目ごとに表示されるようにします。The data (AuctionItem objects) displayed in the ListBox is templated so that the description and the current price are shown for each item. これを使用して、DataTemplateです。This is done using a DataTemplate. さらに、各項目の外観は、表示されている AuctionItemSpecialFeatures の値に依存します。In addition, the appearance of each item depends on the SpecialFeatures value of the AuctionItem being displayed. AuctionItemSpecialFeatures の値が Color の場合、その項目には青の枠線が付きます。If the SpecialFeatures value of the AuctionItem is Color, the item has a blue border. 値が Highlight の場合、その項目にはオレンジの枠線と星が付きます。If the value is Highlight, the item has an orange border and a star. データ テンプレート」セクションでは、データ テンプレートに関する情報を提供します。The Data Templating section provides information about data templating.

  • グループ化、フィルター処理、またはを使用してデータを並べ替えることができます、ユーザー、 CheckBoxes を提供します。The user can group, filter, or sort the data using the CheckBoxes provided. 上記の図で、「グループ化のカテゴリ」および「カテゴリと日付で並べ替え」 CheckBoxes を選択します。In the image above, the "Group by category" and "Sort by category and date" CheckBoxes are selected. データが製品のカテゴリに基づいてグループ化され、カテゴリ名がアルファベット順になっていることが分かります。You may have noticed that the data is grouped based on the category of the product, and the category name is in alphabetical order. 図では分かりにくいですが、項目は各カテゴリ内での開始日でも並べ替えられています。It is difficult to notice from the image but the items are also sorted by the start date within each category. これはコレクション ビューを使用して行えます。This is done using a collection view. コレクション ビューについては、「コレクションにバインドする」セクションで説明します。The Binding to Collections section discusses collection views.

  • ユーザーが、項目を選択したときに、ContentControl選択された項目の詳細が表示されます。When the user selects an item, the ContentControl displays the details of the selected item. これはマスター詳細シナリオと呼ばれます。This is called the Master-Detail scenario. この種類のバインドのシナリオに関する情報は、「マスター詳細シナリオ」セクションにあります。The Master-Detail Scenario section provides information about this type of binding scenario.

  • 型、 StartDateプロパティはDateTime、ミリ秒の時刻を含む日付が返されます。The type of the StartDate property is DateTime, which returns a date that includes the time to the millisecond. このアプリケーションでは、より短い日付文字列を表示するため、カスタムのコンバーターが使用されています。In this application, a custom converter has been used so that a shorter date string is displayed. コンバーターに関する情報は、「データ変換」セクションにあります。The Data Conversion section provides information about converters.

ユーザーが [Add Product (製品の追加)] ボタンをクリックすると、次のフォームが表示されます。When the user clicks the Add Product button, the following form comes up:

製品の追加一覧のページAdd Product Listing page

ユーザーは、フォーム内のフィールドを編集して、簡単なプレビューとより詳細なプレビュー ペインを使用して製品の一覧をプレビューしてから [送信] をクリックして新しい製品の一覧を追加することができます。The user can edit the fields in the form, preview the product listing using the short preview and the more detailed preview panes, and then click submit to add the new product listing. 既存のグループ化、フィルター処理および並べ替えの機能は、新しいエントリに適用されます。Any existing grouping, filtering and sorting functionalities will apply to the new entry. この特定のケースでは、上のイメージで入力した項目が Computer カテゴリ内の 2 番目の項目として表示されます。In this particular case, the item entered in the above image will be displayed as the second item within the Computer category.

検証ロジックので提供されるこのイメージに示されていませんが、 Start Date TextBoxです。Not shown in this image is the validation logic provided in the Start Date TextBox. 場合は、ユーザー入力に無効な日付 (無効な書式設定、または過去の日付) で、ユーザーに通知する、ToolTipおよび横に赤い感嘆符、TextBoxです。If the user enters an invalid date (invalid formatting or a past date), the user will be notified with a ToolTip and a red exclamation point next to the TextBox. 検証ロジックの作成方法については、「データの検証」セクションで説明します。The Data Validation section discusses how to create validation logic.

上記で説明したデータ バインディングのさまざまな機能の説明に入る前に、最初に WPFWPF データ バインディングの理解に欠かせない基本概念について次のセクションで説明します。Before going into the different features of data binding outlined above, we will first discuss in the next section the fundamental concepts that are critical to understanding WPFWPF data binding.

基本的なデータ バインディングの概念Basic Data Binding Concepts

バインドする要素およびデータ ソースの性質に関係なく、各バインドは常に次の図で示したモデルに従います。Regardless of what element you are binding and the nature of your data source, each binding always follows the model illustrated by the following figure:

基本的なデータ バインディング ダイアグラムBasic data binding diagram

上の図に示したように、データ バインディングは本質的に、バインディング ターゲットとバインディング ソース間の橋渡しです。As illustrated by the above figure, data binding is essentially the bridge between your binding target and your binding source. 図には、次の基本的な WPFWPF データ バインディングの概念が示されています。The figure demonstrates the following fundamental WPFWPF data binding concepts:

  • 通常、各バインディングには、バインディング ターゲット オブジェクト、ターゲット プロパティ、バインディング ソース、および使用するバインディング ソース内の値へのパスの 4 つのコンポーネントがあります。Typically, each binding has these four components: a binding target object, a target property, a binding source, and a path to the value in the binding source to use. 内容をバインドする場合など、TextBox名前のプロパティ、従業員オブジェクトを対象のオブジェクトが、 TextBox、target プロパティが、 Textプロパティを使用する値は、名前、され、ソース オブジェクトは、従業員オブジェクト。For example, if you want to bind the content of a TextBox to the Name property of an Employee object, your target object is the TextBox, the target property is the Text property, the value to use is Name, and the source object is the Employee object.

  • ターゲット プロパティは、依存関係プロパティである必要があります。The target property must be a dependency property. ほとんどUIElementプロパティは、依存関係プロパティと読み取り専用のものを除く、ほとんどの依存関係プロパティが既定ではデータ バインディングをサポートします。Most UIElement properties are dependency properties and most dependency properties, except read-only ones, support data binding by default. (だけDependencyObject依存関係プロパティとそのすべての種類を定義できますUIElementから派生して s DependencyObject)。(Only DependencyObject types can define dependency properties and all UIElements derive from DependencyObject.)

  • 図では指定されていませんが、バインディング ソース オブジェクトはカスタム CLRCLR オブジェクトに制限されないことに注意してください。Although not specified in the figure, it should be noted that the binding source object is not restricted to being a custom CLRCLR object. WPFWPF データ バインディングは、CLRCLR オブジェクトおよび XMLXML の形式でデータをサポートします。 data binding supports data in the form of CLRCLR objects and XMLXML. いくつかの例を提供する場合、バインディング ソースがあります、 UIElement、任意のリスト オブジェクト、CLRCLRオブジェクトに関連付けられているADO.NETADO.NETデータまたは Web サービス、またはを含む XmlNode、XMLXMLデータ。To provide some examples, your binding source may be a UIElement, any list object, a CLRCLR object that is associated with ADO.NETADO.NET data or Web Services, or an XmlNode that contains your XMLXML data. 詳しくは、「バインディング ソースの概要」をご覧ください。For more information, see Binding Sources Overview.

他の ソフトウェア開発キット (SDK)software development kit (SDK) トピックを読みながら、バインディングを確立すると、バインディング ターゲットをバインディング ソースバインドしていることを理解することが重要です。As you read through other ソフトウェア開発キット (SDK)software development kit (SDK) topics, it is important to remember that when you are establishing a binding, you are binding a binding target to a binding source. 例では、基になるいくつかを表示する場合のXMLXML内のデータ、ListBoxバインドしてデータ バインディングを使用して、ListBoxXMLXMLデータ。For example, if you are displaying some underlying XMLXML data in a ListBox using data binding, you are binding your ListBox to the XMLXML data.

使用するバインディングを確立するために、Bindingオブジェクト。To establish a binding, you use the Binding object. このトピックの残りの部分に関連付けられている概念の多くと一部のプロパティの使用状況の説明、Bindingオブジェクト。The rest of this topic discusses many of the concepts associated with and some of the properties and usage of the Binding object.

データ フローの方向Direction of the Data Flow

説明したように、上記の図の矢印によって示される、バインディングのデータ フローできますにバインディング ターゲットからバインディング ソース (ユーザーの値を編集するときに、たとえば、元の値が変更、 TextBox) や、バインディング ソースからバインディング ターゲットへ (たとえば、TextBoxバインディング ソースが変更されたコンテンツが更新されます)、バインディング ソースから適切な通知を提供している場合。As mentioned previously and as indicated by the arrow in the figure above, the data flow of a binding can go from the binding target to the binding source (for example, the source value changes when a user edits the value of a TextBox) and/or from the binding source to the binding target (for example, your TextBox content gets updated with changes in the binding source) if the binding source provides the proper notifications.

アプリケーションでユーザーがデータを変更してそれをソース オブジェクトに反映できるようにすることができます。You may want your application to enable users to change the data and propagate it back to the source object. または、ユーザーがソース データを更新できないようにすることもできます。Or you may not want to enable users to update the source data. これを設定して制御することができます、Modeのプロパティ、Bindingオブジェクト。You can control this by setting the Mode property of your Binding object. 次の図は、さまざまなデータ フローの種類を示しています。The following figure illustrates the different types of data flow:

データ バインディングのデータ フローData binding data flow

  • OneWay バインディング ターゲット プロパティを自動的に更新するソース プロパティへの変更がターゲット プロパティへの変更は、ソース プロパティには反映されません。OneWay binding causes changes to the source property to automatically update the target property, but changes to the target property are not propagated back to the source property. この型のバインディングは、バインドされているコントロールが暗黙的な読み取り専用の場合に適しています。This type of binding is appropriate if the control being bound is implicitly read-only. たとえば、株価情報などのソースにバインドしたり、またはターゲット プロパティに、データ バインドされたテーブルの背景色などのように、変更用コントロール インターフェイスがない可能性もあります。For instance, you may bind to a source such as a stock ticker or perhaps your target property has no control interface provided for making changes, such as a data-bound background color of a table. ターゲット プロパティの変更を監視する必要がない場合は、OneWay バインディング モードを使うことにより、TwoWay バインディング モードのオーバーヘッドを回避できます。If there is no need to monitor the changes of the target property, using the OneWay binding mode avoids the overhead of the TwoWay binding mode.

  • TwoWay バインディングでは、基になるプロパティまたは他を自動的に更新する対象プロパティのいずれかの変更が発生します。TwoWay binding causes changes to either the source property or the target property to automatically update the other. この型のバインディングは、編集可能なフォームや完全対話型の UIUI シナリオに適しています。This type of binding is appropriate for editable forms or other fully-interactive UIUI scenarios. ほとんどのプロパティは既定OneWayバインディングがいくつかの依存関係プロパティ (通常はユーザーが編集できるコントロールなどのプロパティ、TextのプロパティTextBoxIsCheckedプロパティのCheckBox)の既定値はTwoWayバインドします。Most properties default to OneWay binding, but some dependency properties (typically properties of user-editable controls such as the Text property of TextBox and the IsChecked property of CheckBox) default to TwoWay binding. 依存関係プロパティが既定で一方向と双方向のどちらでバインドされるかをプログラムで判断する 1 つの方法として、GetMetadata を使用してそのプロパティのプロパティ メタデータを取得してから、BindsTwoWayByDefault プロパティのブール値を確認することがきます。A programmatic way to determine whether a dependency property binds one-way or two-way by default is to get the property metadata of the property using GetMetadata and then check the Boolean value of the BindsTwoWayByDefault property.

  • OneWayToSource 逆順になってOneWayバインディング; がソース プロパティを更新対象プロパティが変更されたときにします。OneWayToSource is the reverse of OneWay binding; it updates the source property when the target property changes. 1 つのサンプル シナリオは、UIUI からのソース値のみを再評価する必要があるかどうかです。One example scenario is if you only need to re-evaluate the source value from the UIUI.

  • 図に示されていませんがOneTimeバインド、それが原因で、ターゲット プロパティを初期化するために、ソース プロパティが、後続の変更は反映されません。Not illustrated in the figure is OneTime binding, which causes the source property to initialize the target property, but subsequent changes do not propagate. これは、データ コンテキストが変更されるか、データ コンテキスト内のオブジェクトが変更された場合に、その変更がターゲット プロパティに反映されないことを意味します。This means that if the data context undergoes a change or the object in the data context changes, then the change is not reflected in the target property. この型のバインディングは、現在の状態のスナップショットが用途に合っている場合や、データが完全に静的である場合に適しています。This type of binding is appropriate if you are using data where either a snapshot of the current state is appropriate to use or the data is truly static. また、ソース プロパティの値を使用してターゲット プロパティを初期化するときにデータ コンテキストが事前にわからない場合にも、この型のバインディングは便利です。This type of binding is also useful if you want to initialize your target property with some value from a source property and the data context is not known in advance. 基本的に、この型のバインディングは、ソース値が変わらない場合にパフォーマンスを向上させる OneWay バインディングを簡易化したものです。This is essentially a simpler form of OneWay binding that provides better performance in cases where the source value does not change.

ソースの変更を検出することに注意してください (に適用できるOneWayTwoWayバインド)、ソースがなど、適切なプロパティの変更通知のメカニズムを実装する必要がありますINotifyPropertyChangedです。Note that to detect source changes (applicable to OneWay and TwoWay bindings), the source must implement a suitable property change notification mechanism such as INotifyPropertyChanged. 参照してください実装プロパティの変更通知の例については、INotifyPropertyChanged実装します。See Implement Property Change Notification for an example of an INotifyPropertyChanged implementation.

Modeプロパティ ページの詳細については、バインディング モードおよびバインディングの方向を指定する方法の例を提供します。The Mode property page provides more information about binding modes and an example of how to specify the direction of a binding.

ソース更新のトリガーWhat Triggers Source Updates

バインドをTwoWayまたはOneWayToSourceターゲット プロパティの変更をリッスンし、それらをソースに反映します。Bindings that are TwoWay or OneWayToSource listen for changes in the target property and propagate them back to the source. これは、ソースの更新と呼ばれます。This is known as updating the source. たとえば、TextBox のテキストを編集して、基になるソース値を変更できます。For example, you may edit the text of a TextBox to change the underlying source value. 最後のセクションで説明した、データ フローの方向がの値によって決まりますが、Modeバインディングのプロパティです。As described in the last section, the direction of the data flow is determined by the value of the Mode property of the binding.

ただし、ソース値が更新されるのは、テキストの編集中またはテキストの編集後にマウス ポインターを TextBox から離した後でしょうか。However, does your source value get updated while you are editing the text or after you finish editing the text and point your mouse away from the TextBox? UpdateSourceTriggerバインドのプロパティは、ソースの更新トリガーを決定します。The UpdateSourceTrigger property of the binding determines what triggers the update of the source. 次の図の右側の矢印のドットの役割を示しています、UpdateSourceTriggerプロパティ。The dots of the right arrows in the following figure illustrate the role of the UpdateSourceTrigger property:

UpdateSourceTrigger ダイアグラムUpdateSourceTrigger diagram

場合、UpdateSourceTrigger値はPropertyChanged、指す値の右矢印TwoWayまたはOneWayToSourceバインドはターゲット プロパティの変更と、すぐに更新を取得します。If the UpdateSourceTrigger value is PropertyChanged, then the value pointed to by the right arrow of TwoWay or the OneWayToSource bindings gets updated as soon as the target property changes. ただし場合、UpdateSourceTrigger値はLostFocus、その値のみを取得更新され、新しい値を持つターゲット プロパティがフォーカスを失ったときにします。However, if the UpdateSourceTrigger value is LostFocus, then that value only gets updated with the new value when the target property loses focus.

ようなModeプロパティ、別の依存関係プロパティが別の既定値を持つUpdateSourceTrigger値。Similar to the Mode property, different dependency properties have different default UpdateSourceTrigger values. ほとんどの依存関係プロパティの既定値は PropertyChanged です。ただし、Text プロパティの既定値は LostFocus です。The default value for most dependency properties is PropertyChanged, while the Text property has a default value of LostFocus. つまり、ソースの更新通常行われるたびに、ターゲット プロパティが変更された、十分機能であるCheckBoxes およびその他の単純なコントロールです。This means that source updates usually happen whenever the target property changes, which is fine for CheckBoxes and other simple controls. しかし、テキスト フィールドについては、キーストロークのたびに更新すると、パフォーマンスが低下する可能性があり、また、ユーザーが新しい値をコミットする前にいつものようにバックスペースでタイプ ミスを消す機会がなくなります。However, for text fields, updating after every keystroke can diminish performance and it denies the user the usual opportunity to backspace and fix typing errors before committing to the new value. だからこそ、Textプロパティの既定値を持つLostFocusの代わりにPropertyChangedです。That is why the Text property has a default value of LostFocus instead of PropertyChanged.

参照してください、UpdateSourceTriggerプロパティ ページを既定値を検索する方法に関する情報をUpdateSourceTrigger依存関係プロパティの値。See the UpdateSourceTrigger property page for information about how to find the default UpdateSourceTrigger value of a dependency property.

次の表は、それぞれのシナリオ例を示しますUpdateSourceTrigger値を使用して、TextBox例として。The following table provides an example scenario for each UpdateSourceTrigger value using the TextBox as an example:

UpdateSourceTrigger の値UpdateSourceTrigger value ソース値が更新されるときWhen the Source Value Gets Updated TextBox のサンプル シナリオExample Scenario for TextBox
LostFocus (の既定のTextBox.Text)LostFocus (default for TextBox.Text) TextBox コントロールがフォーカスを失ったときWhen the TextBox control loses focus ATextBox検証ロジックに関連付けられている (データの検証」セクションを参照してください)A TextBox that is associated with validation logic (see Data Validation section)
PropertyChangedPropertyChanged 入力すると、 TextBoxAs you type into the TextBox TextBox チャット ルーム ウィンドウのコントロールTextBox controls in a chat room window
ExplicitExplicit アプリケーションを呼び出すと UpdateSourceWhen the application calls UpdateSource TextBox (ユーザーが [送信] ボタンをクリックした場合にのみ、ソースの値を更新) 編集可能なフォーム コントロールTextBox controls in an editable form (updates the source values only when the user clicks the submit button)

例については、「TextBox テキストでソースを更新するタイミングを制御する」を参照してください。For an example, see Control When the TextBox Text Updates the Source.

バインディングの作成Creating a Binding

使用してバインドを確立する前のセクションで説明する概念の一部を要約、Bindingオブジェクト、および各バインディングは、通常は 4 つのコンポーネントがあります。 ターゲット、対象のプロパティ、バインディング ソースとバインド パスを使用する元の値。To recapitulate some of the concepts discussed in the previous sections, you establish a binding using the Binding object, and each binding usually has four components: binding target, target property, binding source, and a path to the source value to use. このセクションでは、バインドの設定方法について説明します。This section discusses how to set up a binding.

次の例について考えます。この例では、バインディング ソース オブジェクトは、SDKSample 名前空間で定義されている MyData という名前のクラスです。Consider the following example, in which the binding source object is a class named MyData that is defined in the SDKSample namespace. デモンストレーション目的のため、MyData クラスには、値が "Red" に設定された ColorName という名前の文字列プロパティがあります。For demonstration purposes, MyData class has a string property named ColorName, of which the value is set to "Red". したがって、この例では、背景が赤のボタンが生成されます。Thus, this example generates a button with a red background.

<DockPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:SDKSample">
  <DockPanel.Resources>
    <c:MyData x:Key="myDataSource"/>
  </DockPanel.Resources>
  <DockPanel.DataContext>
    <Binding Source="{StaticResource myDataSource}"/>
  </DockPanel.DataContext>
  <Button Background="{Binding Path=ColorName}"
          Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>

バインディング宣言の構文の詳細およびコード内でバインディングを設定する方法の例については、「バインディング宣言の概要」を参照してください。For more details on the binding declaration syntax and for examples of how to set up a binding in code, see Binding Declarations Overview.

この例を基本的な図に適用すると、結果として得られる図は、次のようになります。If we apply this example to our basic diagram, the resulting figure looks like the following. これは、OneWay背景のプロパティをサポートするためのバインドOneWayデフォルトをバインドします。This is a OneWay binding because the Background property supports OneWay binding by default.

データ バインディング ダイアグラムData binding diagram

なぜこの動作も不思議に思うかもしれません、 ColorNameプロパティの型が文字列中に、Backgroundプロパティの型はBrushします。You may wonder why this works even though the ColorName property is of type string while the Background property is of type Brush. これは作業中の既定の型変換であり、「データ変換」セクションで説明されています。This is default type conversion at work and is discussed in the Data Conversion section.

バインディング ソースの指定Specifying the Binding Source

前の例では、バインディング ソースが指定されている設定に注意してください、DataContextプロパティをDockPanel要素。Notice that in the previous example, the binding source is specified by setting the DataContext property on the DockPanel element. Buttonが継承、DataContext値から、 DockPanel、これは、その親要素です。The Button then inherits the DataContext value from the DockPanel, which is its parent element. 繰り返しますが、バインディング ソース オブジェクトは、バインディングの 4 つの必須コンポーネントの 1 つです。To reiterate, the binding source object is one of the four necessary components of a binding. したがって、バインディング ソース オブジェクトが指定されていないと、バインディングは機能しません。Therefore, without the binding source object being specified, the binding would do nothing.

バインディング ソース オブジェクトを指定するには複数の方法があります。There are several ways to specify the binding source object. 使用して、DataContext親要素のプロパティは、複数のプロパティを同じソースにバインドしているときに便利です。Using the DataContext property on a parent element is useful when you are binding multiple properties to the same source. ただし、個々のバインディング宣言でバインディング ソースを指定する方が適切な場合もあります。However, sometimes it may be more appropriate to specify the binding source on individual binding declarations. 使用せずに、前の例については、DataContextプロパティを設定して、バインディング ソースを指定できます、Source次の例のように、ボタンのバインドの宣言で直接プロパティ。For the previous example, instead of using the DataContext property, you can specify the binding source by setting the Source property directly on the binding declaration of the button, as in the following example:

<DockPanel.Resources>
  <c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
        Background="{Binding Source={StaticResource myDataSource},
                             Path=ColorName}">I am bound to be RED!</Button>

以外の値の設定、DataContext要素を直接にプロパティを継承する、DataContext先祖 (最初の例のボタン) などの値し、明示的に設定して、バインディング ソースを指定する、 Source プロパティBinding(など、ボタンは最後の例) 使用することも、ElementNameプロパティまたはRelativeSourceプロパティをバインディング ソースを指定します。Other than setting the DataContext property on an element directly, inheriting the DataContext value from an ancestor (such as the button in the first example), and explicitly specifying the binding source by setting the Source property on the Binding (such as the button the last example), you can also use the ElementName property or the RelativeSource property to specify the binding source. ElementNameプロパティは、ボタンの幅を調整し、スライダーを使用する場合など、アプリケーションでその他の要素にバインドするときに便利です。The ElementName property is useful when you are binding to other elements in your application, such as when you are using a slider to adjust the width of a button. RelativeSourceプロパティは、バインディングがで指定した場合に便利なControlTemplateまたはStyleです。The RelativeSource property is useful when the binding is specified in a ControlTemplate or a Style. 詳しくは、「バインディング ソースを指定する」をご覧ください。For more information, see Specify the Binding Source.

値にパスを指定するSpecifying the Path to the Value

バインディング ソースがオブジェクトの場合を使用する、Pathプロパティに、バインディングに使用する値を指定します。If your binding source is an object, you use the Path property to specify the value to use for your binding. バインドする場合XMLXML、データを使用する、XPathプロパティの値を指定します。If you are binding to XMLXML data, you use the XPath property to specify the value. 場合によっては、使用に適用可能な場合があります、Path場合でも、データ プロパティXMLXMLです。In some cases, it may be applicable to use the Path property even when your data is XMLXML. たとえば、(XPath クエリ) の結果として返される XmlNode の Name プロパティにアクセスする場合は、する必要がありますを使用して、Pathプロパティのほか、XPathプロパティです。For example, if you want to access the Name property of a returned XmlNode (as a result of an XPath query), you should use the Path property in addition to the XPath property.

構文と例については、次を参照してください。、PathXPathプロパティ ページ。For syntax information and examples, see the Path and XPath property pages.

強調してもなお、Pathを使用する値には、全体のオブジェクトへのバインド先となるシナリオで、バインディングの 4 つの必要なコンポーネントの 1 つを使用する値は、バインド ソース オブジェクトと同じになります。Note that although we have emphasized that the Path to the value to use is one of the four necessary components of a binding, in the scenarios which you want to bind to an entire object, the value to use would be the same as the binding source object. これらの場合に適用を指定しない、Pathです。In those cases, it is applicable to not specify a Path. 次に例を示します。Consider the following example:

<ListBox ItemsSource="{Binding}"
         IsSynchronizedWithCurrentItem="true"/>

上記の例では、空のバインド構文 {Binding} を使用しています。The above example uses the empty binding syntax: {Binding}. ここで、 ListBox DataContext を (この例では表示されません)、親の DockPanel 要素から継承します。In this case, the ListBox inherits the DataContext from a parent DockPanel element (not shown in this example). パスが指定されていない場合、既定では、オブジェクト全体にバインドします。When the path is not specified, the default is to bind to the entire object. つまり、この例では、パスは省略していますおをバインドするため、ItemsSourceプロパティ オブジェクト全体をします。In other words, in this example, the path has been left out because we are binding the ItemsSource property to the entire object. (詳しい説明については、「コレクションにバインドする」セクションを参照してください)。(See the Binding to Collections section for an in-depth discussion.)

コレクションにバインドする以外に、オブジェクトの 1 つのプロパティだけではなくオブジェクト全体にバインドするときにもこのシナリオは役立ちます。Other than binding to a collection, this scenario is also useful when you want to bind to an entire object instead of just a single property of an object. たとえば、ソース オブジェクトが文字列型で、文字列そのものにバインドしたい場合などです。For example, if your source object is of type string and you simply want to bind to the string itself. もう 1 つの一般的なシナリオは、要素をいくつかのプロパティを持つオブジェクトにバインドする場合です。Another common scenario is when you want to bind an element to an object with several properties.

データがバインドされているターゲット プロパティにとって意味のあるものになるように、カスタム ロジックの適用が必要になる場合があることに注意してください。Note that you may need to apply custom logic so that the data is meaningful to your bound target property. (既定の型変換が存在しない場合) カスタム ロジックはカスタムのコンバーターの形式になる場合があります。The custom logic may be in the form of a custom converter (if default type conversion does not exist). コンバーターの詳細については、「データ変換」を参照してください。See Data Conversion for information about converters.

Binding と BindingExpressionBinding and BindingExpression

他の機能およびデータ バインディングの使用状況に入る前に、重要になります、BindingExpressionクラスです。Before getting into other features and usages of data binding, it would be useful to introduce the BindingExpression class. 前のセクションで説明したよう、Bindingクラスは、高度なクラスは、バインディングの宣言、Bindingクラスは、バインディングの特性を指定することは多くのプロパティを提供します。As you have seen in previous sections, the Binding class is the high-level class for the declaration of a binding; the Binding class provides many properties that allow you to specify the characteristics of a binding. 関連するクラスでは、BindingExpressionソースとターゲット間の接続を維持する基になるオブジェクトです。A related class, BindingExpression, is the underlying object that maintains the connection between the source and the target. バインドには、複数のバインド式の間で共有できるすべての情報が含まれています。A binding contains all the information that can be shared across several binding expressions. ABindingExpressionと共有できないインスタンス式は、のすべてのインスタンス情報を含む、Bindingです。A BindingExpression is an instance expression that cannot be shared and contains all the instance information of the Binding.

たとえば、次のように、 myDataObjectのインスタンスは、 MyDataクラス、いるソースBindingオブジェクト、およびMyDataクラスは、定義されたクラスをという名前の文字列プロパティを含む示しますです。For example, consider the following, where myDataObject is an instance of MyData class, myBinding is the source Binding object, and MyData class is a defined class that contains a string property named MyDataProperty. この例のテキスト コンテンツmytextのインスタンスTextBlock示しますです。This example binds the text content of mytext, an instance of TextBlock, to MyDataProperty.

// Make a new source.
MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
// Bind the new data source to the myText TextBlock control's Text dependency property.
myText.SetBinding(TextBlock.TextProperty, myBinding);
' Make a new source.
Dim data1 As New MyData(DateTime.Now)
Dim binding1 As New Binding("MyDataProperty")
binding1.Source = data1
' Bind the new data source to the myText TextBlock control's Text dependency property.
Me.myText.SetBinding(TextBlock.TextProperty, binding1)

同じ myBinding オブジェクトを使用して、他のバインディングを作成できます。You can use the same myBinding object to create other bindings. たとえば、myBinding オブジェクトを使用して、チェック ボックスのテキストの内容を MyDataProperty にバインドすることができます。For example, you may use myBinding object to bind the text content of a check box to MyDataProperty. シナリオでは、ある 2 つのインスタンスになるBindingExpression共有、いるオブジェクト。In that scenario, there will be two instances of BindingExpression sharing the myBinding object.

ABindingExpressionオブジェクトを取得するには呼び出し元の戻り値を使用してGetBindingExpressionデータ バインドされたオブジェクト。A BindingExpression object can be obtained through the return value of calling GetBindingExpression on a data-bound object. 次のトピックでは、点の使用状況を示しています、BindingExpressionクラス。The following topics demonstrate some of the usages of the BindingExpression class:

データ変換Data Conversion

前の例では、ボタンが赤ためそのBackgroundプロパティは、"Red"の値を持つ文字列プロパティにバインドされています。In the previous example, the button is red because its Background property is bound to a string property with the value "Red". これが機能に実行する型コンバーターがあるため、Brushに変換する文字列値の型、Brushです。This works because a type converter is present on the Brush type to convert the string value to a Brush.

この情報を「バインディングの作成」セクションの図に追加すると、図は次のようになります。To add this information to the figure in the Creating a Binding section, the diagram looks like the following:

データ バインディング ダイアグラムData binding diagram

ただし、場合ではなく、バインド ソース オブジェクトは文字列型のプロパティ、型のプロパティColorしますか?However, what if instead of having a property of type string your binding source object has a Color property of type Color? その場合は、バインドが機能するためにする必要があります最初に、ものにプロパティ値をBackgroundプロパティではします。In that case, in order for the binding to work you would need to first turn the Color property value into something that the Background property accepts. 実装することによって、カスタムのコンバーターを作成する必要がありますが、IValueConverter次の例のように、インターフェイス。You would need to create a custom converter by implementing the IValueConverter interface, as in the following example:

[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color color = (Color)value;
        return new SolidColorBrush(color);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
<ValueConversion(GetType(Color), GetType(SolidColorBrush))>
Public Class ColorBrushConverter
	Implements IValueConverter
	Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
		Dim color As Color = CType(value, Color)
		Return New SolidColorBrush(color)
	End Function

	Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
		Return Nothing
	End Function
End Class

IValueConverterリファレンス ページの詳細を提供します。The IValueConverter reference page provides more information.

これで既定の変換の代わりにカスタムのコンバーターが使用されるようになったので、図はこのようになります。Now the custom converter is used instead of default conversion, and our diagram looks like this:

データ バインディング ダイアグラムData binding diagram

繰り返しますが、バインドされている型に存在する型コンバーターにより、既定の変換が使用できます。To reiterate, default conversions may be available because of type converters that are present in the type being bound to. この動作は、ターゲットで利用可能な型コンバーターによって異なります。This behavior will depend on which type converters are available in the target. 独自のコンバーターを作成して、確認してみてください。If in doubt, create your own converter.

データ コンバーターを実装するのが合理的な典型的なシナリオをいくつか次に示します。Following are some typical scenarios where it makes sense to implement a data converter:

  • カルチャに応じてデータを異なる方法で表示する必要がある場合。Your data should be displayed differently, depending on culture. たとえば、特定のカルチャで使用されている値または標準に基づいて、通貨コンバーターまたはカレンダー日付/時刻のコンバーターを実装することができます。For instance, you might want to implement a currency converter or a calendar date/time converter based on the values or standards used in a particular culture.

  • 使用されているデータが必ずしもプロパティのテキスト値を変更することを意図しているわけではく、イメージのソースや表示テキストの色やスタイルなど、他のいくつかの値を変更することを意図している場合。The data being used is not necessarily intended to change the text value of a property, but is instead intended to change some other value, such as the source for an image, or the color or style of the display text. この場合、コンバーターを使用して、適切と思われないプロパティのバインディング (テキスト フィールドをテーブルのセルの Background プロパティにバインドするなど) を変換することができます。Converters can be used in this instance by converting the binding of a property that might not seem to be appropriate, such as binding a text field to the Background property of a table cell.

  • 複数のコントロールまたはコントロールの複数のプロパティが同じデータにバインドされている場合。More than one control or to multiple properties of controls are bound to the same data. この場合、プライマリ バインドがテキストだけを表示する可能性があるのに対し、他のバインドは特定の表示に関する問題を処理しますが、同じバインドをソース情報として使用します。In this case, the primary binding might just display the text, whereas other bindings handle specific display issues but still use the same binding as source information.

  • これまで説明していないまだMultiBinding対象のプロパティがバインディングのコレクションがします。So far we have not yet discussed MultiBinding, where a target property has a collection of bindings. 場合、 MultiBinding、カスタムを使用するIMultiValueConverterのバインディングの値から最終的な値を生成します。In the case of a MultiBinding, you use a custom IMultiValueConverter to produce a final value from the values of the bindings. たとえば、色は赤、青、および緑の値から計算できますが、これらは同じまたは異なるバインディング ソース オブジェクトからの値にすることができます。For example, color may be computed from red, blue, and green values, which can be values from the same or different binding source objects. 参照してください、MultiBinding例と情報クラスのページです。See the MultiBinding class page for examples and information.

コレクションにバインドするBinding to Collections

バインド ソース オブジェクトは、プロパティにデータが含まれている 1 つのオブジェクト、または多くの場合、グループ化されるポリモーフィック型オブジェクト (データベースへのクエリの結果など) のデータ コレクションとして扱うことができます。A binding source object can be treated either as a single object of which the properties contain data or as a data collection of polymorphic objects that are often grouped together (such as the result of a query to a database). ここまでは、1 つのオブジェクトへのバインドだけを説明してきましたが、データ コレクションへのバインドは一般的なシナリオです。So far we've only discussed binding to single objects, however, binding to a data collection is a common scenario. など、一般的なシナリオは、ItemsControlなど、 ListBoxListView、またはTreeViewなどのように、アプリケーションでは、データ コレクションを表示する、データ バインディングとは?セクションです。For example, a common scenario is to use an ItemsControl such as a ListBox, ListView, or TreeView to display a data collection, such as in the application shown in the What Is Data Binding? section.

幸い、基本的な図を引き続き使用できます。Fortunately, our basic diagram still applies. バインドする場合、ItemsControlの図は、次のようなコレクションに。If you are binding an ItemsControl to a collection, the diagram looks like this:

データ バインディング ItemsControl ダイアグラムData binding ItemsControl diagram

バインドをこのダイアグラムに示すように、ItemsControlコレクション オブジェクトにItemsSourceプロパティがプロパティを使用します。As shown in this diagram, to bind an ItemsControl to a collection object, ItemsSource property is the property to use. 考えることができますItemsSourceプロパティの内容として、ItemsControlです。You can think of ItemsSource property as the content of the ItemsControl. バインディングはOneWayため、ItemsSourceプロパティ サポートOneWayデフォルトをバインドします。Note that the binding is OneWay because the ItemsSource property supports OneWay binding by default.

コレクションを実装する方法How to Implement Collections

実装する任意のコレクションを列挙することができます、IEnumerableインターフェイスです。You can enumerate over any collection that implements the IEnumerable interface. ただし、コレクションの挿入や削除を更新できるように動的なバインドを設定する、UIUIコレクションは、自動的に実装する必要があります、INotifyCollectionChangedインターフェイスです。However, to set up dynamic bindings so that insertions or deletions in the collection update the UIUI automatically, the collection must implement the INotifyCollectionChanged interface. このインターフェイスは、基になるコレクションが変更されたときに発生させるイベントを公開します。This interface exposes an event that should be raised whenever the underlying collection changes.

WPFWPF 提供、ObservableCollection<T>クラスは、これは組み込みの実装を公開するデータの収集、INotifyCollectionChangedインターフェイスです。 provides the ObservableCollection<T> class, which is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. ソース オブジェクトからターゲットへのデータ値の転送を完全にサポートするには、バインド可能なプロパティをサポートするコレクション内の各オブジェクト必要がありますで実装することに注意してください、INotifyPropertyChangedインターフェイスです。Note that to fully support transferring data values from source objects to targets, each object in your collection that supports bindable properties must also implement the INotifyPropertyChanged interface. 詳しくは、「バインディング ソースの概要」をご覧ください。For more information, see Binding Sources Overview.

独自のコレクションを実装する前に、使用を検討してObservableCollection<T>またはなどの既存のコレクションのいずれかのクラスList<T>Collection<T>、およびBindingList<T>、その他の多くの間でします。Before implementing your own collection, consider using ObservableCollection<T> or one of the existing collection classes, such as List<T>, Collection<T>, and BindingList<T>, among many others. 高度なシナリオをした独自のコレクションを実装する場合は、使用を検討してIListインデックスとそのため、最適なパフォーマンスで個別にアクセスできるオブジェクトの非ジェネリック コレクションを提供します。If you have an advanced scenario and want to implement your own collection, consider using IList, which provides a non-generic collection of objects that can be individually accessed by index and thus the best performance.

コレクション ビューCollection Views

1 回、ItemsControlがバインドされているデータのコレクションを並べ替え、フィルター、またはグループのデータをする可能性があります。Once your ItemsControl is bound to a data collection, you may want to sort, filter, or group the data. コレクション ビューは、実装するクラスを使用する手順を実行する、ICollectionViewインターフェイスです。To do that, you use collection views, which are classes that implement the ICollectionView interface.

コレクション ビューとはWhat Are Collection Views?

コレクション ビューは、基になるソース コレクション自体を変更することなく、並べ替え、フィルター、およびグループのクエリに基づくソース コレクションを移動および表示を可能にするバインディング ソース コレクションの上にある層です。A collection view is a layer on top of a binding source collection that allows you to navigate and display the source collection based on sort, filter, and group queries, without having to change the underlying source collection itself. コレクション ビューには、コレクション内の現在の項目へのポインターも保持されます。A collection view also maintains a pointer to the current item in the collection. ソース コレクションを実装する場合、INotifyCollectionChangedによって発生した変更のインターフェイス、CollectionChangedイベントは、ビューに反映されます。If the source collection implements the INotifyCollectionChanged interface, the changes raised by the CollectionChanged event are propagated to the views.

ビューは基になるソース コレクションを変更しないため、各ソース コレクションは関連付けられた複数のビューを持つことができます。Because views do not change the underlying source collections, each source collection can have multiple views associated with it. たとえば、Task オブジェクトのコレクションを持つことができます。For example, you may have a collection of Task objects. ビューを使用すると、同じデータをさまざまな方法で表示できます。With the use of views, you can display that same data in different ways. たとえば、ページの左側に優先度で並べ替えられたタスクを表示し、右側に区分でグループ化されたタスクを表示できます。For example, on the left side of your page you may want to show tasks sorted by priority, and on the right side, grouped by area.

ビューの作成方法How to Create a View

ビューを作成して使用する方法の 1 つは、ビュー オブジェクトを直接インスタンス化して、それをバインディング ソースとして使用することです。One way to create and use a view is to instantiate the view object directly and then use it as the binding source. たとえば、「データ バインディングとは」のセクションで示されているデータ バインディング デモを考えてみましょう。For example, consider the Data Binding Demo application shown in the What Is Data Binding? section. アプリケーションを実装するよう、ListBoxデータ コレクションの代わりにデータ コレクション経由で直接ビューをバインドします。The application is implemented such that the ListBox binds to a view over the data collection instead of the data collection directly. 次の例は、データ バインディング デモのアプリケーションから抽出されたものです。The following example is extracted from the Data Binding Demo application. CollectionViewSourceクラスは、Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)から継承するクラスのプロキシCollectionViewです。The CollectionViewSource class is the Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) proxy of a class that inherits from CollectionView. この例では、Sourceのビューにバインドされて、コレクション (型のObservableCollection<T>) の現在のアプリケーション オブジェクトです。In this particular example, the Source of the view is bound to the AuctionItems collection (of type ObservableCollection<T>) of the current application object.

<Window.Resources>
<CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"   
      x:Key="listingDataView" />
</Window.Resources>

リソースlistingDataViewなど、アプリケーション内の要素に対するバインディング ソースとして機能し、 ListBox:The resource listingDataView then serves as the binding source for elements in the application, such as the ListBox:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>

同じコレクションの別のビューを作成することができますを作成する別CollectionViewSourceをインスタンス化し、異なる付けますx:Key名。To create another view for the same collection, you can create another CollectionViewSource instance and give it a different x:Key name.

次の表は、既定のコレクション ビューとまたはするビューのデータ型が作成されますCollectionViewSourceソース コレクションの型に基づいています。The following table shows which view data types are created as the default collection view or by CollectionViewSource based on the source collection type.

ソース コレクションの型Source collection type コレクション ビューの型Collection view type メモNotes
IEnumerable 基づく内部の型 CollectionViewAn internal type based on CollectionView 項目のグループ化は不可Cannot group items.
IList ListCollectionView 最も高速Fastest.
IBindingList BindingListCollectionView
既定のビューの使用Using a Default View

コレクション ビューを作成して使用する 1 つの方法は、バインディング ソースとしてコレクション ビューを指定することです。Specifying a collection view as a binding source is one way to create and use a collection view. WPF では、バインディング ソースとして使用されるすべてのコレクションに対して既定のコレクション ビューも作成されます。WPF also creates a default collection view for every collection used as a binding source. コレクションに直接バインドすると、WPF はその既定のビューにバインドします。If you bind directly to a collection, WPF binds to its default view. この既定のビューは、同じコレクションにバインドされているすべてのバインディングで共有されるため、1 つのバインド コントロールまたはコードによる既定のビューへの変更 (後述する並べ替えや現在の項目ポインターへの変更など) は、同じコレクションにバインドされている他のすべてのバインディングに反映されます。Note that this default view is shared by all bindings to the same collection, so a change made to a default view by one bound control or code (such as sorting or a change to the current item pointer, discussed later) is reflected in all other bindings to the same collection.

既定のビューを取得するには、使用して、GetDefaultViewメソッドです。To get the default view, you use the GetDefaultView method. 例については、「データ コレクションの既定のビューを取得する」を参照してください。For an example, see Get the Default View of a Data Collection.

コレクション ビューと ADO.NET DataTableCollection Views with ADO.NET DataTables

コレクション ビューの ADO.NET のパフォーマンスを向上させるDataTableまたはDataViewオブジェクトに並べ替えとフィルターの委任、DataViewです。To improve performance, collection views for ADO.NET DataTable or DataView objects delegate sorting and filtering to the DataView. これにより、並べ替えとフィルター処理がデータ ソースのすべてのコレクション ビューで共有されます。This causes sorting and filtering to be shared across all collection views of the data source. 並べ替えし、別にフィルター処理するには、各コレクション ビューを有効にするには、するには、独自の各コレクション ビューを初期化DataViewオブジェクト。To enable each collection view to sort and filter independently, initialize each collection view with its own DataView object.

並べ替えSorting

前述したように、ビューでは並べ替え順序をコレクションに適用できます。As mentioned before, views can apply a sort order to a collection. これは基になるコレクション内に存在するため、データに関連性がない場合や、本来の順序ではない場合もあります。As it exists in the underlying collection, your data may or may not have a relevant, inherent order. コレクションのビューでは、指定する比較の基準に基づいて、順序を強制したり、既定の順序を変更することができます。The view over the collection allows you to impose an order, or change the default order, based on comparison criteria that you supply. これはデータのクライアント ベースのビューであるため、一般的なシナリオは、ユーザーが列に対応する値ごとに表形式のデータの列を並べ替える場合です。Because it is a client-based view of the data, a common scenario is that the user might want to sort columns of tabular data per the value that the column corresponds to. ビューを使用することで、このようなユーザー主導の並べ替えを適用することができます。この場合も、基になるコレクションを変更したり、コレクションのコンテンツにクエリを再実行する必要はありません。Using views, this user-driven sort can be applied, again without making any changes to the underlying collection or even having to requery for the collection content. 例については、「ヘッダーがクリックされたときに GridView 列を並べ替える」を参照してください。For an example, see Sort a GridView Column When a Header Is Clicked.

次の例は、「カテゴリと日付で並べ替え」の並べ替えロジックCheckBoxアプリケーションのUIUIで、データ バインディングとは?セクション。The following example shows the sorting logic of the "Sort by category and date" CheckBox of the application UIUI in the What Is Data Binding? section:

private void AddSorting(object sender, RoutedEventArgs args)
{
    // This sorts the items first by Category and within each Category,
    // by StartDate. Notice that because Category is an enumeration,
    // the order of the items is the same as in the enumeration declaration
    listingDataView.SortDescriptions.Add(
        new SortDescription("Category", ListSortDirection.Ascending));
    listingDataView.SortDescriptions.Add(
        new SortDescription("StartDate", ListSortDirection.Ascending));
}
Private Sub AddSorting(ByVal sender As Object, ByVal args As RoutedEventArgs)
    'This sorts the items first by Category and within each Category, by StartDate
    'Notice that because Category is an enumeration, the order of the items is the same as in the 
    'enumeration declaration
    listingDataView.SortDescriptions.Add(New SortDescription("Category", ListSortDirection.Ascending))
    listingDataView.SortDescriptions.Add(New SortDescription("StartDate", ListSortDirection.Ascending))
End Sub

フィルター処理Filtering

ビューでは、コレクションにフィルターを適用することもできます。Views can also apply a filter to a collection. つまり、項目がコレクションに存在していても、この特定のビューは、コレクション全体の特定のサブセットのみを表示することを意図しています。This means that although an item might exist in the collection, this particular view is intended to show only a certain subset of the full collection. データ内の条件をフィルターすることができます。You might filter on a condition in the data. インスタンスとしてはにおいてアプリケーションによって、データ バインディングとは?セクションで、「表示のみなバーゲン」CheckBox原価が $25 以上である項目をフィルター処理するためのロジックが含まれています。For instance, as is done by the application in the What Is Data Binding? section, the "Show only bargains" CheckBox contains logic to filter out items that cost $25 or more. 次のコードが実行を設定するShowOnlyBargainsFilterとして、Filterイベント ハンドラーとをCheckBoxが選択されています。The following code is executed to set ShowOnlyBargainsFilter as the Filter event handler when that CheckBox is selected:

listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
AddHandler listingDataView.Filter, AddressOf ShowOnlyBargainsFilter

ShowOnlyBargainsFilter イベント ハンドラーには、次の実装があります。The ShowOnlyBargainsFilter event handler has the following implementation:

private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
    AuctionItem product = e.Item as AuctionItem;
    if (product != null)
    {
        // Filter out products with price 25 or above
        if (product.CurrentPrice < 25)
        {
            e.Accepted = true;
        }
        else
        {
            e.Accepted = false;
        }
    }
}
Private Sub ShowOnlyBargainsFilter(ByVal sender As Object, ByVal e As FilterEventArgs)
    Dim product As AuctionItem = CType(e.Item, AuctionItem)
    If Not (product Is Nothing) Then
        'Filter out products with price 25 or above
        If product.CurrentPrice < 25 Then
            e.Accepted = True
        Else
            e.Accepted = False
        End If
    End If
End Sub

いずれかを使用している場合、CollectionViewクラスの直接の代わりにCollectionViewSource、使用すると、Filterコールバックを指定するプロパティです。If you are using one of the CollectionView classes directly instead of CollectionViewSource, you would use the Filter property to specify a callback. 例については、「ビュー内のデータをフィルター処理する」を参照してください。For an example, see Filter Data in a View.

グループ化Grouping

ビュー内部のクラスを除く、IEnumerableコレクション、コレクションのすべてのビューは、論理グループにコレクション ビュー内のコレクションを分割することができます、グループ化の機能をサポートします。Except for the internal class that views an IEnumerable collection, all collection views support the functionality of grouping, which allows the user to partition the collection in the collection view into logical groups. グループは、明示的 (ユーザーがグループの一覧を提供する) または暗黙的 (グループがデータに応じて動的に生成される) にすることができます。The groups can be explicit, where the user supplies a list of groups, or implicit, where the groups are generated dynamically depending on the data.

次の例は、「カテゴリでグループ」のロジックCheckBox:The following example shows the logic of the "Group by category" CheckBox:

// This groups the items in the view by the property "Category"
PropertyGroupDescription groupDescription = new PropertyGroupDescription();
groupDescription.PropertyName = "Category";
listingDataView.GroupDescriptions.Add(groupDescription);
'This groups by property "Category"
Dim groupDescription As PropertyGroupDescription = New PropertyGroupDescription
groupDescription.PropertyName = "Category"
listingDataView.GroupDescriptions.Add(groupDescription)

別のグループ化の例については、「GridView を実装する ListView の項目をグループ化する」を参照してください。For another grouping example, see Group Items in a ListView That Implements a GridView.

現在の項目ポインターCurrent Item Pointers

ビューでは、現在の項目の概念もサポートされています。Views also support the notion of a current item. コレクション ビュー内のオブジェクト間を移動することができます。You can navigate through the objects in a collection view. 移動するときに、項目のポインターを動かすことで、コレクション内の特定の場所に存在するオブジェクトを取得できます。As you navigate, you are moving an item pointer that allows you to retrieve the object that exists at that particular location in the collection. 例については、「データ CollectionView のオブジェクト間を移動する」を参照してください。For an example, see Navigate Through the Objects in a Data CollectionView.

WPF はビュー (指定したビュー、またはコレクションの既定のビュー) を使用してコレクションのみにバインドするため、コレクションへのすべてのバインディングには現在の項目のポインターがあります。Because WPF binds to a collection only by using a view (either a view you specify, or the collection's default view), all bindings to collections have a current item pointer. ビューにバインドする際に、Path 値内のスラッシュ ("/") 文字は、ビューの現在の項目を指定します。When binding to a view, the slash ("/") character in a Path value designates the current item of the view. 次の例では、データ コンテキストはコレクション ビューです。In the following example, the data context is a collection view. 最初の行は、コレクションにバインドします。The first line binds to the collection. 2 番目の行は、コレクション内の現在の項目にバインドします。The second line binds to the current item in the collection. 3 番目の行は、コレクション内の現在の項目の Description プロパティにバインドします。The third line binds to the Description property of the current item in the collection.

<Button Content="{Binding }" />  
<Button Content="{Binding Path=/}" />  
<Button Content="{Binding Path=/Description}" />   

スラッシュとプロパティの構文をスタックして、コレクションの階層をトラバースすることもできます。The slash and property syntax can also be stacked to traverse a hierarchy of collections. 次の例では、ソース コレクションの現在の項目のプロパティでである、Offices という名前のコレクションの現在の項目にバインドします。The following example binds to the current item of a collection named Offices, which is a property of the current item of the source collection.

<Button Content="{Binding /Offices/}" />  

現在の項目のポインターは、コレクションに適用されている任意の並べ替えまたはフィルター処理の影響を受ける場合があります。The current item pointer can be affected by any sorting or filtering that is applied to the collection. 並べ替えは、現在の項目のポインターを最後に選択した項目に保持しますが、コレクション ビューはそれを中心に再構築されています Sorting preserves the current item pointer on the last item selected, but the collection view is now restructured around it. (以前はリストの先頭にあった選択した項目が、現在はリストの中ほどにある場合があります)。フィルター処理後に選択した項目がビューに残っている場合、フィルター処理はその項目を保持します。(Perhaps the selected item was at the beginning of the list before, but now the selected item might be somewhere in the middle.) Filtering preserves the selected item if that selection remains in view after the filtering. それ以外の場合は、現在の項目のポインターが、フィルター処理されたコレクション ビューの最初の項目に設定されます。Otherwise, the current item pointer is set to the first item of the filtered collection view.

マスターと詳細のバインディング シナリオMaster-Detail Binding Scenario

現在の項目の概念は、コレクション内の項目間の移動に役立つだけでなく、マスターと詳細のバインディング シナリオにも役立ちます。The notion of a current item is useful not only for navigation of items in a collection, but also for the master-detail binding scenario. もう一度、「データ バインディングとは」セクションのアプリケーション UIUI を考えてみましょう。Consider the application UIUI in the What Is Data Binding? section again. そのアプリケーション内の選択範囲で、ListBoxに表示されるコンテンツの決定、ContentControlです。In that application, the selection within the ListBox determines the content shown in the ContentControl. 別の方法で配置するときに、ListBox項目が選択されている、ContentControl選択した項目の詳細を表示します。To put it in another way, when a ListBox item is selected, the ContentControl shows the details of the selected item.

同じビューにバインドされた 2 つ以上のコントロールがあるだけで、マスターと詳細のシナリオを実装できます。You can implement the master-detail scenario simply by having two or more controls bound to the same view. 次の例、データ バインディング デモのマークアップを示しています、ListBoxContentControlアプリケーションを参照してくださいUIUIで、データ バインディングとは?セクション。The following example from the Data Binding Demo shows the markup of the ListBox and the ContentControl you see on the application UIUI in the What Is Data Binding? section:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>
<ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3" 
        Content="{Binding Source={StaticResource listingDataView}}" 
        ContentTemplate="{StaticResource detailsProductListingTemplate}" 
        Margin="9,0,0,0"/>

両方のコントロールが同じソース listingDataView 静的リソース (このリソースの定義は「ビューの作成方法」セクションを参照してください) にバインドされていることに注目してください。Notice that both of the controls are bound to the same source, the listingDataView static resource (see the definition of this resource in the How to Create a View section). これが機能ためときに、シングルトン オブジェクト (、ContentControlここでは) がバインドされてコレクション ビューを自動的にバインドされている、CurrentItemビューのです。This works because when a singleton object (the ContentControl in this case) is bound to a collection view, it automatically binds to the CurrentItem of the view. なおCollectionViewSourceオブジェクトは、通貨および選択範囲に自動的に同期します。Note that CollectionViewSource objects automatically synchronize currency and selection. リスト コントロールがバインドされていない場合、CollectionViewSourceを設定する必要がありますが、この例のようにオブジェクト、IsSynchronizedWithCurrentItemプロパティをtrueこれを行います。If your list control is not bound to a CollectionViewSource object as in this example, then you would need to set its IsSynchronizedWithCurrentItem property to true for this to work.

その他の例については、「コレクションにバインドして選択に基づく情報を表示する」と「階層データでマスター詳細パターンを使用する」を参照してください。For other examples, see Bind to a Collection and Display Information Based on Selection and Use the Master-Detail Pattern with Hierarchical Data.

上記の例では、テンプレートが使用されています。You may have noticed that the above example uses a template. 実際には、データが表示されないよう、テンプレートを使用せず (で明示的に使用される、ContentControlで暗黙的に使用していると、 ListBox)。In fact, the data would not be displayed the way we wish without the use of templates (the one explicitly used by the ContentControl and the one implicitly used by the ListBox). 次のセクションで、データ テンプレートについて説明します。We now turn to data templating in the next section.

データ テンプレートData Templating

データ テンプレートを使用しないと、「データ バインディングとは」セクションのアプリケーション UIUI は、次のようになります。Without the use of data templates, our application UIUI in the What Is Data Binding? section would look like the following:

データ テンプレートを使用しないデータ バインディング デモData Binding Demo without Data Templates

前のセクションの例で示すように両方、ListBoxコントロールとContentControlのコレクション オブジェクト全体 (またはより具体的には、コレクション オブジェクト上のビュー) にバインドされたAuctionItems。As shown in the example in the previous section, both the ListBox control and the ContentControl are bound to the entire collection object (or more specifically, the view over the collection object) of AuctionItems. データ コレクションを表示する方法の具体的な指示せず、ListBox基になるコレクションの各オブジェクトの文字列表現を表示して、ContentControlにバインドされているオブジェクトの文字列表現を表示します。Without specific instructions of how to display the data collection, the ListBox is displaying a string representation of each object in the underlying collection and the ContentControl is displaying a string representation of the object it is bound to.

アプリケーションの定義に問題を解決するDataTemplates。To solve that problem, the application defines DataTemplates. 前のセクションの例のように、ContentControlを明示的に使用、 detailsProductListingTemplateDataTemplateです。As shown in the example in the previous section, the ContentControl explicitly uses the detailsProductListingTemplateDataTemplate. ListBoxコントロールが暗黙的に、次を使用してDataTemplate表示するときに、 AuctionItemコレクション内のオブジェクト。The ListBox control implicitly uses the following DataTemplate when displaying the AuctionItem objects in the collection:

<DataTemplate DataType="{x:Type src:AuctionItem}">
    <Border BorderThickness="1" BorderBrush="Gray"
            Padding="7" Name="border" Margin="3" Width="500">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="86"/>
            <ColumnDefinition Width="*"/>
          </Grid.ColumnDefinitions>
              
            <Polygon Grid.Row="0" Grid.Column="0" Grid.RowSpan="4"
                     Fill="Yellow" Stroke="Black" StrokeThickness="1"
                     StrokeLineJoin="Round" Width="20" Height="20"
                     Stretch="Fill"
                     Points="9,2 11,7 17,7 12,10 14,15 9,12 4,15 6,10 1,7 7,7"
                     Visibility="Hidden" Name="star"/>

            <TextBlock Grid.Row="0" Grid.Column="1" Margin="0,0,8,0"
                       Name="descriptionTitle"
                       Style="{StaticResource smallTitleStyle}">Description:</TextBlock>
            <TextBlock Name="DescriptionDTDataType" Grid.Row="0" Grid.Column="2" 
                Text="{Binding Path=Description}" 
                Style="{StaticResource textStyleTextBlock}"/>

            <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,0,8,0"
                       Name="currentPriceTitle"
                       Style="{StaticResource smallTitleStyle}">Current Price:</TextBlock>
            <StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal">
                <TextBlock Text="$" Style="{StaticResource textStyleTextBlock}"/>
                <TextBlock Name="CurrentPriceDTDataType" 
                    Text="{Binding Path=CurrentPrice}" 
                    Style="{StaticResource textStyleTextBlock}"/>
            </StackPanel>
        </Grid>
    </Border>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Color</src:SpecialFeatures>
            </DataTrigger.Value>
          <DataTrigger.Setters>
            <Setter Property="BorderBrush" Value="DodgerBlue" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
          </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Highlight</src:SpecialFeatures>
            </DataTrigger.Value>
            <Setter Property="BorderBrush" Value="Orange" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="Visibility" Value="Visible" TargetName="star" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

これら 2 つの使用にDataTemplates、結果として得られる UI に示されている、データ バインディングとは?セクションです。With the use of those two DataTemplates, the resulting UI is the one shown in the What Is Data Binding? section. スクリーン ショットからわかることに加えてに配置するデータ、コントロールDataTemplates を使用して、データの魅力的なビジュアルを定義します。As you can see from that screenshot, in addition to letting you place data in your controls, DataTemplates allow you to define compelling visuals for your data. たとえば、 DataTriggers が上記で使用されるDataTemplateようにAuctionItemSpecialFeaturesの値を強調表示とともに表示、オレンジ色の罫線と星型。For example, DataTriggers are used in the above DataTemplate so that AuctionItems with SpecialFeatures value of HighLight would be displayed with an orange border and a star.

データ テンプレートの詳細については、「データ テンプレートの概要」を参照してください。For more information about data templates, see the Data Templating Overview.

データの検証Data Validation

ユーザー入力を受け取るほとんどのアプリケーションには、ユーザーが必要な情報を入力していることを確認する検証ロジックが必要です。Most applications that take user input need to have validation logic to ensure that the user has entered the expected information. 検証チェックは、型、範囲、形式、またはその他のアプリケーションに固有の要件に基づいて作成できます。The validation checks can be based on type, range, format, or other application-specific requirements. このセクションでは、WPFWPF でデータ検証がどのように機能するかについて説明します。This section discusses how data validation works in the WPFWPF.

検証ルールをバインドに関連付けるAssociating Validation Rules with a Binding

WPFWPFデータ バインディング モデルを使用すると、関連付けるValidationRulesで、Bindingオブジェクト。The WPFWPF data binding model allows you to associate ValidationRules with your Binding object. たとえば、次の例の連結、TextBoxという名前のプロパティをStartPriceを追加し、ExceptionValidationRuleオブジェクトをBinding.ValidationRulesプロパティです。For example, the following example binds a TextBox to a property named StartPrice and adds a ExceptionValidationRule object to the Binding.ValidationRules property.

<TextBox Name="StartPriceEntryForm" Grid.Row="2" Grid.Column="1"
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
  <TextBox.Text>
    <Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <ExceptionValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

AValidationRuleオブジェクトでは、プロパティの値が有効かどうかを確認します。A ValidationRule object checks whether the value of a property is valid. WPFWPF 組み込みの次の 2 種類がValidationRuleオブジェクト。 has the following two types of built-in ValidationRule objects:

派生することで、独自の検証規則を作成することも、ValidationRuleクラスと実装、Validateメソッドです。You can also create your own validation rule by deriving from the ValidationRule class and implementing the Validate method. 次の例で使用される規則を示しています、製品の一覧の追加「開始日」TextBoxから、データ バインディングとは?セクション。The following example shows the rule used by the Add Product Listing "Start Date" TextBox from the What Is Data Binding? section:

class FutureDateRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        DateTime date;
        try
        {
            date = DateTime.Parse(value.ToString());
        }
        catch (FormatException)
        {
            return new ValidationResult(false, "Value is not a valid date.");
        }
        if (DateTime.Now.Date > date)
        {
            return new ValidationResult(false, "Please enter a date in the future.");
        }
        else
        {
            return ValidationResult.ValidResult;
        }
    }
}
Public Class FutureDateRule
    Inherits ValidationRule

    Public Overrides Function Validate(ByVal value As Object,
                                       ByVal cultureInfo As System.Globalization.CultureInfo) _
                                   As System.Windows.Controls.ValidationResult

        Dim DateVal As DateTime

        Try
            DateVal = DateTime.Parse(value.ToString)
        Catch ex As FormatException
            Return New ValidationResult(False, "Value is not a valid date.")
        End Try

        If DateTime.Now.Date > DateVal Then
            Return New ValidationResult(False, "Please enter a date in the future.")
        Else
            Return ValidationResult.ValidResult
        End If
    End Function
End Class

StartDateEntryForm TextBoxこれを使用してFutureDateRule次の例のように。The StartDateEntryForm TextBox uses this FutureDateRule, as shown in the following example:

<TextBox Name="StartDateEntryForm" Grid.Row="3" Grid.Column="1" 
    Validation.ErrorTemplate="{StaticResource validationTemplate}" 
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
    <TextBox.Text>
        <Binding Path="StartDate" UpdateSourceTrigger="PropertyChanged" 
            Converter="{StaticResource dateConverter}" >
            <Binding.ValidationRules>
                <src:FutureDateRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

注意してください、UpdateSourceTrigger値はPropertyChanged、バインディング エンジン更新になってもチェックするすべてのキーストロークで元の値のすべてのルール、ValidationRulesすべてキーストロークでのコレクション。Note that because the UpdateSourceTrigger value is PropertyChanged, the binding engine updates the source value on every keystroke, which means it also checks every rule in the ValidationRules collection on every keystroke. これについては、「検証プロセス」セクションで詳しく説明します。We discuss this further in the Validation Process section.

視覚的なフィードバックを提供するProviding Visual Feedback

ユーザーが無効な値を入力した場合に、エラーに関する何らかのフィードバックをアプリケーション UIUI に提供することができます。If the user enters an invalid value, you may want to provide some feedback about the error on the application UIUI. 設定には、このようなフィードバックを提供する 1 つの方法、Validation.ErrorTemplate添付プロパティをカスタムにControlTemplateです。One way to provide such feedback is to set the Validation.ErrorTemplate attached property to a custom ControlTemplate. 以前のサブセクションでは、ように、 StartDateEntryForm TextBoxを使用して、ErrorTemplateと呼ばれるためです。As shown in the previous subsection, the StartDateEntryForm TextBox uses an ErrorTemplate called validationTemplate. 次の例は、validationTemplate の定義を示します。The following example shows the definition of validationTemplate:

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

AdornedElementPlaceholder要素は、装飾されるコントロールの配置場所を指定します。The AdornedElementPlaceholder element specifies where the control being adorned should be placed.

さらに、使用することも、ToolTipエラー メッセージを表示します。In addition, you may also use a ToolTip to display the error message. 両方のStartDateEntryFormStartPriceEntryFormTextBoxes スタイルを使用してtextStyleTextBoxを作成する、ToolTipですエラー メッセージが表示されます。Both the StartDateEntryForm and the StartPriceEntryFormTextBoxes use the style textStyleTextBox, which creates a ToolTip that displays the error message. 次の例は、textStyleTextBox の定義を示します。The following example shows the definition of textStyleTextBox. 添付プロパティHasErrortrueバインドされている要素のプロパティのバインディングの 1 つ以上がエラーにします。The attached property HasError is true when one or more of the bindings on the properties of the bound element are in error.

<Style x:Key="textStyleTextBox" TargetType="TextBox">
  <Setter Property="Foreground" Value="#333333" />
  <Setter Property="MaxLength" Value="40" />
  <Setter Property="Width" Value="392" />
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

カスタムErrorTemplateToolTipStartDateEntryForm TextBoxよう、検証エラーがある場合に、以下。With the custom ErrorTemplate and the ToolTip, the StartDateEntryForm TextBox looks like the following when there is a validation error:

データ バインディングの検証エラーData binding validation error

場合、Binding検証規則が関連付けられているを指定しないで、ErrorTemplateバインドされたコントロールで、既定値、ErrorTemplate検証エラーがある場合にユーザーに通知するために使用されます。If your Binding has associated validation rules but you do not specify an ErrorTemplate on the bound control, a default ErrorTemplate will be used to notify users when there is a validation error. 既定値ErrorTemplate装飾層に赤い枠線を定義するコントロールのテンプレートです。The default ErrorTemplate is a control template that defines a red border in the adorner layer. 既定値でErrorTemplateToolTipUIUIStartPriceEntryForm TextBoxよう、検証エラーがある場合に、次。With the default ErrorTemplate and the ToolTip, the UIUI of the StartPriceEntryForm TextBox looks like the following when there is a validation error:

データ バインディングの検証エラーData binding validation error

ダイアログ ボックス内のすべてのコントロールを検証するためのロジックを提供する方法の例については、「ダイアログ ボックスの概要」の「カスタム ダイアログ ボックス」セクションを参照してください。For an example of how to provide logic to validate all controls in a dialog box, see the Custom Dialog Boxes section in the Dialog Boxes Overview.

検証プロセスValidation Process

検証は通常、ターゲットの値がバインディング ソースのプロパティに転送されるときに発生します。Validation usually occurs when the value of a target is transferred to the binding source property. これで発生TwoWayOneWayToSourceバインドします。This occurs on TwoWay and OneWayToSource bindings. 繰り返しますが、ソースの更新の原因によって異なりますの値、UpdateSourceTriggerプロパティ、」の説明に従って、どのようなトリガー ソースの更新のセクションです。To reiterate, what causes a source update depends on the value of the UpdateSourceTrigger property, as described in the What Triggers Source Updates section.

次に検証プロセスを説明します。The following describes the validation process. このプロセス中の任意の時点で検証エラーまたはその他の種類のエラーが発生すると、プロセスが停止されることに注意してください。Note that if a validation error or other type of error occurs at any time during this process, the process is halted.

  1. バインディング エンジンは、任意のカスタムがあるかを確認ValidationRuleオブジェクトで定義されているValidationStepに設定されているRawProposedValueBinding、呼び出している場合、ValidateメソッドをそれぞれValidationRule中にエラーが、それらのいずれかが実行されるまでそれらのすべてに合格するまで、または。The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to RawProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule until one of them runs into an error or until all of them pass.

  2. その後、バインディング エンジンがコンバーターを呼び出します (ある場合)。The binding engine then calls the converter, if one exists.

  3. コンバーターが成功した場合、バインド エンジンか確認任意のカスタムValidationRuleオブジェクトで定義されているValidationStepに設定されているConvertedProposedValueBinding、呼び出している場合、ValidateメソッドをそれぞれValidationRuleを持つValidationStep 'éý'ConvertedProposedValue中にエラーが、それらのいずれかが実行されるまで、またはそれらのすべてに合格するまでです。If the converter succeeds, the binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to ConvertedProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to ConvertedProposedValue until one of them runs into an error or until all of them pass.

  4. バインディング エンジンは、ソース プロパティを設定します。The binding engine sets the source property.

  5. バインディング エンジンは、任意のカスタムがあるかを確認ValidationRuleオブジェクトで定義されているValidationStepに設定されているUpdatedValueBinding、呼び出している場合、ValidateメソッドをそれぞれValidationRuleを持つValidationStepに設定UpdatedValue中にエラーが、それらのいずれかが実行されるまで、またはそれらのすべてに合格するまでです。The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to UpdatedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to UpdatedValue until one of them runs into an error or until all of them pass. 場合、 DataErrorValidationRule 、バインドに関連付けられて、そのValidationStep、既定値に設定されているUpdatedValueでは、DataErrorValidationRuleがこの時点でチェックします。If a DataErrorValidationRule is associated with a binding and its ValidationStep is set to the default, UpdatedValue, the DataErrorValidationRule is checked at this point. これは、ポイントでもときにバインディングを持つ、 ValidatesOnDataErrors 'éý'trueがチェックされます。This is also the point when bindings that have the ValidatesOnDataErrors set to true are checked.

  6. バインディング エンジンは、任意のカスタムがあるかを確認ValidationRuleオブジェクトで定義されているValidationStepに設定されているCommittedValueBinding、呼び出している場合、ValidateメソッドをそれぞれValidationRuleを持つValidationStepに設定CommittedValue中にエラーが、それらのいずれかが実行されるまで、またはそれらのすべてに合格するまでです。The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to CommittedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to CommittedValue until one of them runs into an error or until all of them pass.

場合、ValidationRule渡しませんバインディング エンジンが作成時に、このプロセス全体を通じて、ValidationErrorオブジェクトを追加して、Errorsバインドされている要素のコレクション。If a ValidationRule does not pass at any time throughout this process, the binding engine creates a ValidationError object and adds it to the Errors collection of the bound element. エンジンは、バインディングの前に、実行、ValidationRule任意指定のステップでは、オブジェクトのいずれかを削除しますValidationErrorに追加された、Errorsそのステップ中にバインドされている要素のプロパティに接続します。Before the binding engine runs the ValidationRule objects at any given step, it removes any ValidationError that was added to the Errors attached property of the bound element during that step. たとえば場合、ValidationRuleValidationStepに設定されているUpdatedValueに失敗しました次回の検証プロセスが発生すると、バインディング エンジンが削除されるValidationError前にいずれかの呼び出しの直前にValidationRuleを持つValidationStepに設定UpdatedValueFor example, if a ValidationRule whose ValidationStep is set to UpdatedValue failed, the next time the validation process occurs, the binding engine removes that ValidationError immediately before it calls any ValidationRule that has ValidationStep set to UpdatedValue.

ときにErrorsは空でなく、HasError接続されている要素のプロパティがtrueです。When Errors is not empty, the HasError attached property of the element is set to true. また場合、NotifyOnValidationErrorのプロパティ、Bindingに設定されているtrue、バインディング エンジンが発生し、Validation.Error要素のイベントをアタッチします。Also, if the NotifyOnValidationError property of the Binding is set to true, then the binding engine raises the Validation.Error attached event on the element.

どちらの方向 (ソースまたはターゲットをソースにターゲット) に有効な値の転送をクリアするメモも、Errors添付プロパティ。Also note that a valid value transfer in either direction (target to source or source to target) clears the Errors attached property.

バインディングがいずれかの場合、ExceptionValidationRuleに関連付けられているかであった、ValidatesOnExceptionsプロパティに設定されているtrueバインディング エンジンが、ソースを設定すると、例外がスローされたバインディング エンジンが確認するかどうかがあると、UpdateSourceExceptionFilterです。If the binding either has an ExceptionValidationRule associated with it, or had the ValidatesOnExceptions property is set to true and an exception is thrown when the binding engine sets the source, the binding engine checks to see if there is a UpdateSourceExceptionFilter. 使用するオプションがある、UpdateSourceExceptionFilterコールバックが例外を処理するためのカスタム ハンドラーを提供します。You have the option to use the UpdateSourceExceptionFilter callback to provide a custom handler for handling exceptions. 場合、UpdateSourceExceptionFilterが指定されていない、 Binding、バインディング エンジンを作成、ValidationError例外を使用し、それを追加、Errorsバインドされている要素のコレクション。If an UpdateSourceExceptionFilter is not specified on the Binding, the binding engine creates a ValidationError with the exception and adds it to the Errors collection of the bound element.

デバッグのメカニズムDebugging Mechanism

添付プロパティを設定することができますTraceLevel特定のバインドの状態に関する情報を受信するバインディングに関連するオブジェクト。You can set the attached property TraceLevel on a binding-related object to receive information about the status of a specific binding.

関連項目See Also

DataErrorValidationRule
WPF Version 4.5 の新機能What's New in WPF Version 4.5
LINQ クエリの結果にバインドするBind to the Results of a LINQ Query
データ バインディングData Binding
データ バインディング デモData Binding Demo
方法トピックHow-to Topics
ADO.NET データ ソースにバインドするBind to an ADO.NET Data Source