Übersicht über die DatenbindungData Binding Overview

Die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Datenbindung bietet für Anwendungen eine einfache und konsistente Möglichkeit, Daten darzustellen und mit ihnen zu interagieren.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding provides a simple and consistent way for applications to present and interact with data. Elemente können an Daten aus einer Vielzahl von Datenquellen in Form von Common Language Runtime (CLR)common language runtime (CLR)-Objekten und XMLXML gebunden werden.Elements can be bound to data from a variety of data sources in the form of Common Language Runtime (CLR)common language runtime (CLR) objects and XMLXML. ContentControls wie z. B. Button und ItemsControls wie z. B. ListBox und ListView verfügen über integrierte Funktionen, um flexible Formatierung von einzelnen Datenelementen oder Auflistungen von Datenelementen zu aktivieren.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. Sortier-, Filter- und Gruppenansichten können übergreifend für die Daten generiert werden.Sort, filter, and group views can be generated on top of the data.

Die Datenbindungsfunktionen in WPFWPF bieten gegenüber herkömmlichen Modellen einige Vorteile. Dazu zählen eine Reihe von Eigenschaften, die Datenbindung grundsätzlich unterstützen, eine flexible Darstellung von Daten auf einer UIUI sowie die klare Trennung zwischen Geschäftslogik und 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.

In diesem Thema wird zunächst erläutert die grundlegenden Konzepte WPFWPF Datenbindung und anschließend wird die Verwendung der Binding -Klasse und anderen Features der Datenbindung.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.

Was ist Datenbindung?What Is Data Binding?

Durch Datenbindung wird eine Verbindung zwischen der UIUI der Anwendung und der Geschäftslogik hergestellt.Data binding is the process that establishes a connection between the application UIUI and business logic. Wenn die Bindung die ordnungsgemäßen Einstellungen aufweist und die Daten die richtigen Benachrichtigungen bereitstellen, ändern sich die an die Daten gebundenen Elemente automatisch bei jeder Änderung des Werts der Daten, sodass die Änderungen entsprechend wiedergegeben werden.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. Datenbindung kann auch bedeuten, dass bei einer Änderung der äußeren Darstellung von Daten in einem Element die zugrunde liegenden Daten automatisch aktualisiert werden können, um die Änderung wiederzugeben.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. Z. B., wenn der Benutzer den Wert in bearbeitet ein TextBox Element, das zugrunde liegende Datenwert wird automatisch aktualisiert, um diese Änderung zu übernehmen.For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.

Eine typische Verwendung der Datenbindung wäre, die auf einem Server oder lokal gespeicherten Konfigurationsdaten in Formulare oder andere Steuerelemente der UIUI einzufügen.A typical use of data binding is to place server or local configuration data into forms or other UIUI controls. In WPFWPF wird dieses Konzept dahingehend erweitert, dass auch eine Vielzahl von Eigenschaften an die unterschiedlichsten Datenquellen gebunden werden können.In WPFWPF, this concept is expanded to include the binding of a broad range of properties to a variety of data sources. In WPFWPF können Abhängigkeitseigenschaften von Elementen an CLRCLR-Objekte (einschließlich ADO.NETADO.NET-Objekte oder Objekte, die Webdiensten und Webeigenschaften zugeordnet sind) und XMLXML-Daten gebunden werden.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.

Ein Beispiel für eine Datenbindung finden Sie auf der UIUI der folgenden Anwendung in der Demo für die Datenbindung:For an example of data binding, take a look at the following application UIUI from the Data Binding Demo:

Daten-beispielscreenshot: BindungData binding sample screenshot

Oben sehen Sie die UIUI einer Anwendung, die eine Liste von Auktionselementen anzeigt.The above is the UIUI of an application that displays a list of auction items. Die Anwendung veranschaulicht die folgenden Datenbindungsfunktionen:The application demonstrates the following features of data binding:

  • Den Inhalt der ListBox gebunden ist, auf eine Auflistung von AuctionItem Objekte.The content of the ListBox is bound to a collection of AuctionItem objects. Ein AuctionItem-Objekt verfügt über Eigenschaften wie Description, StartPrice, StartDate, Category, SpecialFeatures usw.An AuctionItem object has properties such as Description, StartPrice, StartDate, Category, SpecialFeatures, etc.

  • Die Daten (AuctionItem Objekte) angezeigt, der ListBox auf Vorlagen basierende ist, sodass die Beschreibung und den aktuellen Preis für jedes Element angezeigt werden.The data (AuctionItem objects) displayed in the ListBox is templated so that the description and the current price are shown for each item. Dies erfolgt mithilfe einer DataTemplate.This is done using a DataTemplate. Darüber hinaus hängt die Darstellung jedes Elements vom SpecialFeatures-Wert des angezeigten AuctionItem ab.In addition, the appearance of each item depends on the SpecialFeatures value of the AuctionItem being displayed. Wenn der SpecialFeatures-Wert von AuctionItem auf Color festgelegt ist, hat das Element einen blauen Rahmen.If the SpecialFeatures value of the AuctionItem is Color, the item has a blue border. Wenn der Wert Highlight ist, hat das Element einen orangefarbenen Rahmen und einen Stern.If the value is Highlight, the item has an orange border and a star. Im Abschnitt Datenvorlagen erhalten Sie weitere Informationen zu Datenvorlagen.The Data Templating section provides information about data templating.

  • Der Benutzer kann gruppieren, filtern oder Sortieren der Daten mithilfe der CheckBoxes bereitgestellt.The user can group, filter, or sort the data using the CheckBoxes provided. In der Abbildung oben, die "Group by Category" und "Sort by Category and Date" CheckBoxes ausgewählt sind.In the image above, the "Group by category" and "Sort by category and date" CheckBoxes are selected. Möglicherweise haben Sie bereits bemerkt, dass die Daten nach der Kategorie des Produkts gruppiert sind und der Name der Kategorie in alphabetischer Reihenfolge aufgeführt ist.You may have noticed that the data is grouped based on the category of the product, and the category name is in alphabetical order. In der Abbildung ist nicht so gut zu erkennen, dass auch die Elemente innerhalb der einzelnen Kategorien nach Startdatum sortiert sind.It is difficult to notice from the image but the items are also sorted by the start date within each category. Dazu wird eine Auflistungsansicht verwendet.This is done using a collection view. Im Abschnitt Binden an Auflistungen werden Auflistungsansichten erläutert.The Binding to Collections section discusses collection views.

  • Wenn der Benutzer ein Element markiert die ContentControl zeigt die Details des ausgewählten Elements.When the user selects an item, the ContentControl displays the details of the selected item. Dies wird als Master/Detail-Szenario bezeichnet.This is called the Master-Detail scenario. Im Abschnitt Master/Detail-Szenario erhalten Sie Informationen zu diesem Typ von Bindungsszenario.The Master-Detail Scenario section provides information about this type of binding scenario.

  • Der Typ des der "StartDate" Eigenschaft DateTime, ein Datum mit der Zeit auf die Millisekunde genau zurückgegeben.The type of the StartDate property is DateTime, which returns a date that includes the time to the millisecond. In dieser Anwendung wurde ein benutzerdefinierter Konverter verwendet, damit eine kürzere Datumszeichenfolge angezeigt wird.In this application, a custom converter has been used so that a shorter date string is displayed. Weitere Informationen zu Konvertern finden Sie im Abschnitt Datenkonvertierung.The Data Conversion section provides information about converters.

Wenn der Benutzer auf die Schaltfläche Add Product klickt, wird das folgende Formular aufgerufen:When the user clicks the Add Product button, the following form comes up:

Seite „Produktliste hinzufügen“Add Product Listing page

Der Benutzer kann die Felder im Formular bearbeiten, die Produktauflistung in der Kurzvorschau und in den detaillierteren Vorschaufenstern anzeigen und dann auf submit klicken, um die neue Produktauflistung hinzuzufügen.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. Alle vorhandenen Gruppierungs-, Filter- und Sortierfunktionen werden auf den neuen Eintrag angewendet.Any existing grouping, filtering and sorting functionalities will apply to the new entry. In diesem speziellen Fall wird das im obigen Bild eingegebene Element in der Kategorie Computer an zweiter Stelle angezeigt.In this particular case, the item entered in the above image will be displayed as the second item within the Computer category.

In dieser Abbildung nicht dargestellt, ist die Validierungslogik, die bereitgestellt werden, der Startdatum TextBox.Not shown in this image is the validation logic provided in the Start Date TextBox. Wenn der Benutzer, ein ungültiges eingibt Datum (mit ungültiger Formatierung oder einem vergangenen Datum), mit der Benutzer benachrichtigt werden eine ToolTip und ein rotes Ausrufezeichen neben der 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. Im Abschnitt Datenvalidierung wird näher auf das Erstellen von Validierungslogik eingegangen.The Data Validation section discusses how to create validation logic.

Bevor die oben genannten unterschiedlichen Datenbindungsfunktionen näher erläutert werden, werden im nächsten Abschnitt die grundlegenden Konzepte erläutert, die für ein Verständnis der WPFWPF-Datenbindung unerlässlich sind.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.

Grundlegende Konzepte zur DatenbindungBasic Data Binding Concepts

Unabhängig davon, welches Element Sie binden und welcher Art die Datenquelle ist, erfolgt die Bindung stets gemäß dem in der folgenden Abbildung gezeigten Modell: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:

Das Diagramm, die das einfache Datenbindungsmodell anzeigt.

Wie in der Abbildung dargestellt, ist Datenbindung die Brücke zwischen dem Bindungsziel und der Bindungsquelle.As illustrated by the above figure, data binding is essentially the bridge between your binding target and your binding source. Die Abbildung veranschaulicht die folgenden grundlegenden Konzepte der WPFWPF-Datenbindung:The figure demonstrates the following fundamental WPFWPF data binding concepts:

  • Eine Bindung besteht in der Regel aus diesen vier Komponenten: einem Bindungszielobjekt, einer Zieleigenschaft, einer Bindungsquelle sowie einem Pfad zum Wert in der Bindungsquelle, die verwendet werden soll.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. Z. B., wenn Sie den Inhalt einer binden möchten eine TextBox auf die Namen Eigenschaft eine Mitarbeiter Objekt, das Zielobjekt der TextBox, die Zieleigenschaft der Text Eigenschaft, die zu verwendende Wert Namen, und das Quellobjekt ist die Mitarbeiter Objekt.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.

  • Die Zieleigenschaft muss eine Abhängigkeitseigenschaft sein.The target property must be a dependency property. Die meisten UIElement -Eigenschaften sind Abhängigkeitseigenschaften und die meisten Abhängigkeitseigenschaften, außer schreibgeschützten, unterstützen die Datenbindung standardmäßig.Most UIElement properties are dependency properties and most dependency properties, except read-only ones, support data binding by default. (Nur DependencyObject -Typen können Abhängigkeitseigenschaften und alle definieren UIElements abgeleitet DependencyObject.)(Only DependencyObject types can define dependency properties and all UIElements derive from DependencyObject.)

  • Obwohl nicht in der Abbildung angegeben, sollte beachtet werden, dass das Bindungsquellenobjekt nicht darauf beschränkt ist, als benutzerdefiniertes CLRCLR-Objekt zu fungieren.Although not specified in the figure, it should be noted that the binding source object is not restricted to being a custom CLRCLR object. Die WPFWPF-Datenbindung unterstützt Daten in Form von CLRCLR-Objekten und XMLXML.WPFWPF data binding supports data in the form of CLRCLR objects and XMLXML. Um Beispiele zu ermöglichen, die Bindungsquelle möglicherweise eine UIElement, beliebiges Listenobjekt, ein CLRCLR -Objekt, das zugeordnet ist ADO.NETADO.NET Daten oder Webdienste oder eine XmlNode-Klasse, die enthält Ihre XMLXML Daten.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. Weitere Informationen finden Sie unter Übersicht über Bindungsquellen.For more information, see Binding Sources Overview.

Beim Lesen anderer Software Development Kit (SDK)software development kit (SDK)-Themen sollten Sie daran denken, dass Sie beim Einrichten einer Bindung ein Bindungsziel an eine Bindungsquelle binden.As you read through other Software Development Kit (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. Angenommen, Sie einige zugrunde liegende anzeigen XMLXML Daten in eine ListBox mithilfe der Datenbindung, erfolgt die Bindung Ihrer ListBox auf die XMLXML Daten.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.

Um eine Bindung herzustellen, verwenden Sie die Binding Objekt.To establish a binding, you use the Binding object. Im weiteren Verlauf dieses Themas erläutert viele der Konzepte und einige der Eigenschaften und die Nutzung der Binding Objekt.The rest of this topic discusses many of the concepts associated with and some of the properties and usage of the Binding object.

Richtung des DatenflussesDirection of the Data Flow

Wie bereits erwähnt, und wie durch den Pfeil in der Abbildung oben angezeigt, kann Datenfluss einer Bindung vom Bindungsziel zur Bindungsquelle wechseln (z. B. den Wert des ändert, wenn ein Benutzer den Wert des bearbeitet ein TextBox) und/oder von der Bindungsquelle an das Bindungsziel (z. B. Ihre TextBox Inhalt mit Änderungen in der Bindungsquelle aktualisiert wird), wenn die Bindungsquelle die entsprechenden Benachrichtigungen bereitstellt.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.

Sie können die Anwendung so einrichten, dass Benutzer die Daten ändern und zurück an das Quellobjekt übertragen können.You may want your application to enable users to change the data and propagate it back to the source object. Sie können auch das Aktualisieren von Quelldaten durch Benutzer unterbinden.Or you may not want to enable users to update the source data. Sie können dies steuern, durch Festlegen der Mode Eigenschaft Ihre Binding Objekt.You can control this by setting the Mode property of your Binding object. In der folgenden Abbildung werden die unterschiedlichen Datenflusstypen veranschaulicht:The following figure illustrates the different types of data flow:

Datenfluss bei der DatenbindungData binding data flow

  • OneWay Bindung bewirkt, dass Änderungen an der Quelleigenschaft die Zieleigenschaft automatisch aktualisiert, aber Änderungen an der Zieleigenschaft nicht zurück an die Quelleigenschaft weitergegeben werden.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. Dieser Bindungstyp empfiehlt sich, wenn das gebundene Steuerelement implizit als schreibgeschützt festgelegt wurde.This type of binding is appropriate if the control being bound is implicitly read-only. Sie können beispielsweise eine Bindung an eine Quelle wie einen Börsenticker erstellen, oder möglicherweise ist für die Zieleigenschaft keine Steuerungsoberfläche verfügbar, um Änderungen vorzunehmen, z. B. an der datengebundenen Hintergrundfarbe einer Tabelle.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. Wenn die Änderungen der Zieleigenschaft nicht überwacht werden müssen, vermeiden Sie mit dem OneWay-Bindungsmodus den Mehraufwand des TwoWay-Bindungsmodus.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 Bindung bewirkt, dass Änderungen auf die Quelleigenschaft oder der Zieleigenschaft die jeweils andere automatisch aktualisiert.TwoWay binding causes changes to either the source property or the target property to automatically update the other. Dieser Typ von Bindung ist für bearbeitbare Formulare und sonstige vollständig interaktive UIUI-Szenarien geeignet.This type of binding is appropriate for editable forms or other fully-interactive UIUI scenarios. Die meisten Eigenschaften standardmäßig OneWay Bindung, aber einige Abhängigkeitseigenschaften (meistens Eigenschaften von vom Benutzer bearbeitbare Steuerelemente wie z. B. die Text Eigenschaft TextBox und IsChecked Eigenschaft CheckBox) standardmäßig TwoWay Bindung.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. Eine programmgesteuerte Methode zum Bestimmen, ob eine Abhängigkeitseigenschaft standardmäßig uni- oder bidirektional bindet, besteht darin, die Metadaten der Eigenschaft mit GetMetadata abzurufen und dann den booleschen Wert der BindsTwoWayByDefault-Eigenschaft zu überprüfen.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 Stellt die Umkehrung der OneWay Bindung; er aktualisiert die Quelleigenschaft, wenn die Zieleigenschaft ändert.OneWayToSource is the reverse of OneWay binding; it updates the source property when the target property changes. Ein Beispielszenario besteht darin, einfach den Quellwert von der UIUI neu zu bewerten.One example scenario is if you only need to re-evaluate the source value from the UIUI.

  • In der Abbildung nicht dargestellt ist OneTime Bindung, die bewirkt, dass der Quelleigenschaft die Zieleigenschaft initialisiert, aber nachfolgende Änderungen werden nicht weitergegeben.Not illustrated in the figure is OneTime binding, which causes the source property to initialize the target property, but subsequent changes do not propagate. Wenn sich also der Datenkontext oder das Objekt im Datenkontext ändert, wird die Änderung in der Zieleigenschaft nicht angezeigt.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. Dieser Bindungstyp empfiehlt sich, wenn Sie Daten verwenden, bei denen eine Momentaufnahme des aktuellen Zustands verwendet werden kann oder die Daten tatsächlich statisch sind.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. Dieser Bindungstyp ist auch hilfreich, wenn die Zieleigenschaft mit einem bestimmten Wert der Quelleigenschaft initialisiert werden soll und der Datenkontext vorab nicht bekannt ist.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. Dies ist eine wesentlich einfachere Form der OneWay-Bindung, die eine bessere Leistung in Situationen bietet, in denen sich der Quellwert nicht ändert.This is essentially a simpler form of OneWay binding that provides better performance in cases where the source value does not change.

Beachten Sie, dass zum Erkennen von quelländerungen (gilt für OneWay und TwoWay Bindungen), muss die Quelle einen Änderungsbenachrichtigungsmechanismus von geeigneten wie z. B. implementieren 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. Finden Sie unter bei Eigenschaftenänderungen implementieren ein Beispiel für eine INotifyPropertyChanged Implementierung.See Implement Property Change Notification for an example of an INotifyPropertyChanged implementation.

Die Mode -Eigenschaftenseite bietet weitere Informationen zu Bindungsmodi und ein Beispiel dafür, wie Sie die Richtung einer Bindung an.The Mode property page provides more information about binding modes and an example of how to specify the direction of a binding.

Wodurch werden Quellaktualisierungen ausgelöst?What Triggers Source Updates

Bindungen TwoWay oder OneWayToSource Lauschen auf Änderungen in der Zieleigenschaft und übertragen sie zurück an die Quelle.Bindings that are TwoWay or OneWayToSource listen for changes in the target property and propagate them back to the source. Dies wird als Aktualisieren der Quelle bezeichnet.This is known as updating the source. Sie können beispielsweise den Text eines TextBox-Elements bearbeiten, um den zugrunde liegenden Quellwert zu ändern.For example, you may edit the text of a TextBox to change the underlying source value. Wie im vorherigen Abschnitt beschrieben wird, wird die Richtung des Datenflusses durch den Wert bestimmt die Mode -Eigenschaft der Bindung.As described in the last section, the direction of the data flow is determined by the value of the Mode property of the binding.

Wird der Quellwert aktualisiert, während Sie den Text bearbeiten oder nachdem Sie die Bearbeitung abgeschlossen haben und den Mauszeiger aus dem TextBox-Steuerelement bewegen?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? Die UpdateSourceTrigger -Eigenschaft der Bindung bestimmt, wodurch die Aktualisierung der Quelle ausgelöst.The UpdateSourceTrigger property of the binding determines what triggers the update of the source. Die Punkte der richtigen Pfeile in der folgenden Abbildung veranschaulichen die Rolle der UpdateSourceTrigger Eigenschaft:The dots of the right arrows in the following figure illustrate the role of the UpdateSourceTrigger property:

Diagramm die Rolle von der UpdateSourceTrigger-Eigenschaft zeigt.

Wenn die UpdateSourceTrigger Wert PropertyChanged, klicken Sie dann der Wert verweist den Pfeil nach rechts von TwoWay oder OneWayToSource Bindungen aktualisiert wird, sobald die Zieleigenschaft ändert.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. Aber wenn die UpdateSourceTrigger Wert LostFocus, und klicken Sie dann diesen Wert nur durch den neuen Wert aktualisiert wird, wenn die Zieleigenschaft den Fokus verliert.However, if the UpdateSourceTrigger value is LostFocus, then that value only gets updated with the new value when the target property loses focus.

Ähnlich wie die Mode -Eigenschaft haben verschiedene Abhängigkeitseigenschaften unterschiedliche UpdateSourceTrigger Werte.Similar to the Mode property, different dependency properties have different default UpdateSourceTrigger values. Der Standardwert für die meisten Abhängigkeitseigenschaften ist PropertyChanged, während die Text-Eigenschaft den Standardwert LostFocus aufweist.The default value for most dependency properties is PropertyChanged, while the Text property has a default value of LostFocus. Dies bedeutet, dass quellaktualisierungen in der Regel bei jedem auftreten, die Zieleigenschaft ändert, handelt es sich gut für CheckBoxes und anderen einfachen Steuerelementen.This means that source updates usually happen whenever the target property changes, which is fine for CheckBoxes and other simple controls. Bei Textfeldern kann eine Aktualisierung nach jeder Tastatureingabe die Leistung mindern und führt außerdem dazu, dass der Benutzer nicht wie gewohnt durch Drücken der Rücktaste Tippfehler beheben kann, bevor der neue Wert übergeben wird.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. Deshalb die Text Eigenschaft hat den Standardwert LostFocus anstelle von PropertyChanged.That is why the Text property has a default value of LostFocus instead of PropertyChanged.

Finden Sie unter den UpdateSourceTrigger Eigenschaftenseite finden Sie Informationen zur Suche nach dem UpdateSourceTrigger Wert einer Abhängigkeitseigenschaft.See the UpdateSourceTrigger property page for information about how to find the default UpdateSourceTrigger value of a dependency property.

Die folgende Tabelle enthält ein Beispielszenario für die einzelnen UpdateSourceTrigger -Wert mithilfe der TextBox als Beispiel:The following table provides an example scenario for each UpdateSourceTrigger value using the TextBox as an example:

UpdateSourceTrigger-WertUpdateSourceTrigger value Wenn der Quellwert aktualisiert wirdWhen the Source Value Gets Updated Beispielszenario für TextBoxExample Scenario for TextBox
LostFocus (Standard für TextBox.Text)LostFocus (default for TextBox.Text) Wenn das TextBox-Steuerelement den Fokus verliertWhen the TextBox control loses focus Ein TextBox , Validierungslogik zugeordnet ist (siehe Abschnitt zur Datenvalidierung)A TextBox that is associated with validation logic (see Data Validation section)
PropertyChangedPropertyChanged Während der Eingabe in die TextBoxAs you type into the TextBox TextBox Steuerelemente in einem chatroomfensterTextBox controls in a chat room window
ExplicitExplicit Wenn die Anwendung aufruft UpdateSourceWhen the application calls UpdateSource TextBox Steuerelemente in einem bearbeitbaren Formular (aktualisiert die Quellwerte nur klickt der Benutzer die Schaltfläche "Senden")TextBox controls in an editable form (updates the source values only when the user clicks the submit button)

Ein Beispiel finden Sie unter Gewusst wie: Steuern, wann der TextBox-Text die Quelle aktualisiert.For an example, see Control When the TextBox Text Updates the Source.

Erstellen einer BindungCreating a Binding

Um einige der in den vorherigen Abschnitten vorgestellten Konzepte einzugehen, Sie Einrichten einer Bindung mit der Binding -Objekt und jede Bindung in der Regel besteht aus vier Komponenten: Binden von Ziel, Zieleigenschaft, Bindungsquelle und einen Pfad an der, die zu verwendende Quellwert.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. In diesem Abschnitt wird das Einrichten einer Bindung erläutert.This section discusses how to set up a binding.

Im folgenden Beispiel ist das Bindungsquellobjekt eine Klasse namens MyData, die im Namespace SDKSample definiert ist.Consider the following example, in which the binding source object is a class named MyData that is defined in the SDKSample namespace. Zu Demonstrationszwecken hat die MyData-Klasse eine Zeichenfolgeneigenschaft namens ColorName, deren Wert auf „Red“ festgelegt ist.For demonstration purposes, MyData class has a string property named ColorName, of which the value is set to "Red". In diesem Beispiel wird also eine Schaltfläche mit einem roten Hintergrund erstellt.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>

Weitere Informationen zur Syntax der Bindungsdeklaration und Beispiele zum Einrichten einer Bindung im Code finden Sie unter Übersicht über Bindungsdeklarationen.For more details on the binding declaration syntax and for examples of how to set up a binding in code, see Binding Declarations Overview.

Wenn dieses Beispiel auf das einfache Diagramm angewendet wird, sieht die resultierend Abbildung wie die folgende aus.If we apply this example to our basic diagram, the resulting figure looks like the following. Dies ist eine OneWay -Bindung, da die Background-Eigenschaft unterstützt OneWay standardmäßig binden.This is a OneWay binding because the Background property supports OneWay binding by default.

Diagramm, das zeigt, die die Datenbindung Background-Eigenschaft.

Sie Fragen sich vielleicht, warum dies funktioniert, obwohl die ColorName Eigenschaft ist vom Typ String, während die Background Eigenschaft ist vom Typ Brush.You may wonder why this works even though the ColorName property is of type string while the Background property is of type Brush. Der Grund dafür ist die Standardtypkonvertierung, die im Abschnitt Datenkonvertierung näher erläutert wird.This is default type conversion at work and is discussed in the Data Conversion section.

Angeben der BindungsquelleSpecifying the Binding Source

Beachten Sie, dass im vorherigen Beispiel die Bindungsquelle, durch Festlegen angegeben wird der DataContext Eigenschaft für die DockPanel Element.Notice that in the previous example, the binding source is specified by setting the DataContext property on the DockPanel element. Die Button erbt dann die DataContext Wert aus der DockPanel, die das übergeordnete Element ist.The Button then inherits the DataContext value from the DockPanel, which is its parent element. Das Bindungsquellobjekt stellt, wie bereits erwähnt, eine der vier erforderlichen Komponenten einer Bindung dar.To reiterate, the binding source object is one of the four necessary components of a binding. Wäre das Bindungsquellobjekt nicht angegeben, hätte die Bindung keine Auswirkungen.Therefore, without the binding source object being specified, the binding would do nothing.

Es gibt mehrere Möglichkeiten, das Bindungsquellobjekt anzugeben.There are several ways to specify the binding source object. Mithilfe der DataContext Eigenschaft für ein übergeordnetes Element ist nützlich, wenn Sie mehrere Eigenschaften an dieselbe Quelle binden.Using the DataContext property on a parent element is useful when you are binding multiple properties to the same source. Es kann aber auch zweckmäßiger sein, die Bindungsquelle in einzelnen Bindungsdeklarationen anzugeben.However, sometimes it may be more appropriate to specify the binding source on individual binding declarations. Für das vorherige Beispiel, anstatt die DataContext -Eigenschaft, können Sie angeben der Bindungsquelle durch Festlegen der Source Eigenschaft direkt auf der Bindungsdeklaration der Schaltfläche wie im folgenden Beispiel gezeigt: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>

Anders als das Festlegen der DataContext Eigenschaft für ein Element direkt, erben die DataContext aus einem Vorgänger (z. B. die Schaltfläche im ersten Beispiel), und das Angeben der Bindungsquelle explizit durch Festlegen der Source Eigenschaft für die Binding (z. B. die Schaltfläche im letzten Beispiel), können Sie auch die ElementName Eigenschaft oder das RelativeSource Eigenschaft, um die Bindungsquelle angeben.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. Die ElementName Eigenschaft ist nützlich, wenn Sie an andere Elemente in Ihrer Anwendung binden, z. B. Wenn Sie einen Schieberegler anpassen, die Breite einer Schaltfläche.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. Die RelativeSource Eigenschaft ist nützlich, wenn die Bindung, in angegeben wird eine ControlTemplate oder Style.The RelativeSource property is useful when the binding is specified in a ControlTemplate or a Style. Weitere Informationen finden Sie unter Angeben der Bindungsquelle.For more information, see Specify the Binding Source.

Angeben des Pfads zum WertSpecifying the Path to the Value

Wenn die Bindungsquelle ein Objekt ist, verwenden Sie die Path Eigenschaft zum Angeben des Werts, der für die Bindung verwendet.If your binding source is an object, you use the Path property to specify the value to use for your binding. Wenn Sie eine Bindung XMLXML Daten, die Sie verwenden die XPath Eigenschaft zum Angeben des Werts.If you are binding to XMLXML data, you use the XPath property to specify the value. In einigen Fällen ist es möglicherweise gilt für die Verwendung der Path Eigenschaft selbst, wenn Ihre Daten sind XMLXML.In some cases, it may be applicable to use the Path property even when your data is XMLXML. Z. B. Wenn Sie die Name-Eigenschaft eines zurückgegebenen XmlNode (als Ergebnis einer XPath-Abfrage) zugreifen möchten, verwenden Sie die Path Eigenschaft zusätzlich zu den XPath Eigenschaft.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.

Weitere Informationen zur Syntax und Beispiele finden Sie unter den Path und XPath Eigenschaftenseiten.For syntax information and examples, see the Path and XPath property pages.

Beachten Sie, dass, obwohl wir, die Ihr Interesse und haben die Path für den zu verwendenden Wert ist eine der vier erforderlichen Komponenten einer Bindung, in Szenarien, in denen Sie an ein vollständiges Objekt binden möchten, die der zu verwendenden Wert wäre das Bindungsquellobjekt identisch.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. In diesen Fällen ist es gilt nicht für an eine Path.In those cases, it is applicable to not specify a Path. Betrachten Sie das folgende Beispiel:Consider the following example:

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

Im obigen Beispiel wird die leere Bindungssyntax verwendet: {Binding}.The above example uses the empty binding syntax: {Binding}. In diesem Fall die ListBox erbt den DataContext von einem übergeordneten DockPanel-Element (nicht in diesem Beispiel dargestellt).In this case, the ListBox inherits the DataContext from a parent DockPanel element (not shown in this example). Wenn der Pfad nicht angegeben wurde, erfolgt die Bindung standardmäßig an das gesamte Objekt.When the path is not specified, the default is to bind to the entire object. Das heißt, in diesem Beispiel der Pfad wurde ausgelassen, da wir binden die ItemsSource Eigenschaft, um das gesamte Objekt.In other words, in this example, the path has been left out because we are binding the ItemsSource property to the entire object. (Im Abschnitt Binden an Auflistungen wird ausführlich darauf eingegangen.)(See the Binding to Collections section for an in-depth discussion.)

Dieses Szenario ist nicht nur zum Binden an eine Auflistung hilfreich, sondern auch zum Binden an ein vollständiges Objekt statt nur an eine einzelne Eigenschaft eines Objekts.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. Wenn es sich beim Quellobjekt beispielsweise um einen Zeichenfolgentyp handelt und Sie lediglich an die Zeichenfolge binden möchten.For example, if your source object is of type string and you simply want to bind to the string itself. Ein anderes allgemeines Szenario besteht darin, ein Element an ein Objekt mit mehreren Eigenschaften zu binden.Another common scenario is when you want to bind an element to an object with several properties.

Beachten Sie, dass Sie ggf. benutzerdefinierte Logik anwenden müssen, damit die Daten für die gebundene Zieleigenschaft sinnvoll sind.Note that you may need to apply custom logic so that the data is meaningful to your bound target property. Bei der benutzerdefinierten Logik kann es sich z. B. um einen benutzerdefinierten Konverter handeln (falls keine Standardtypkonvertierung vorhanden ist).The custom logic may be in the form of a custom converter (if default type conversion does not exist). Weitere Informationen über Konverter finden Sie unter Datenkonvertierung.See Data Conversion for information about converters.

Die „Binding“-Klasse und „BindingExpression“Binding and BindingExpression

Vor dem Abrufen auf andere Features und Verwendungsmöglichkeiten der Datenbindung, es wäre hilfreich, stellen Sie vor der BindingExpression Klasse.Before getting into other features and usages of data binding, it would be useful to introduce the BindingExpression class. Wie Sie, in den vorherigen Abschnitten gesehen haben der Binding Klasse ist die allgemeine Klasse für die Deklaration einer Bindung; die Binding -Klasse bietet zahlreiche Eigenschaften, mit denen Sie die Merkmale einer Bindung angeben.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. Eine verwandte Klasse BindingExpression, ist das zugrunde liegende Objekt, das die Verbindung zwischen der Quelle und Ziel aufrechterhält.A related class, BindingExpression, is the underlying object that maintains the connection between the source and the target. Ein Bindung enthält sämtliche Informationen, die von mehreren Bindungsausdrücken gemeinsam genutzt werden können.A binding contains all the information that can be shared across several binding expressions. Ein BindingExpression ist ein Instanzenausdruck, der nicht gemeinsam genutzt werden kann und sämtliche Instanzeninformationen von enthält die Binding.A BindingExpression is an instance expression that cannot be shared and contains all the instance information of the Binding.

Betrachten Sie beispielsweise die folgenden, in denen MyDataObject ist eine Instanz der MyData -Klasse, MyBinding ist die Quelle Binding -Objekt und MyData Klasse ist eine definierte Klasse, die eine Zeichenfolgeneigenschaft namens enthält MyDataProperty.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. In diesem Beispiel bindet den Textinhalt von "MyText", eine Instanz von TextBlockzu MyDataProperty.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)

Mit demselben myBinding-Objekt können Sie auch andere Bindungen erstellen.You can use the same myBinding object to create other bindings. Sie können beispielsweise mit dem myBinding-Objekt eine Bindung des Textinhalts eines Kontrollkästchens an MyDataProperty herstellen.For example, you may use myBinding object to bind the text content of a check box to MyDataProperty. In diesem Szenario werden zwei Instanzen von BindingExpression Freigabe der MyBinding Objekt.In that scenario, there will be two instances of BindingExpression sharing the myBinding object.

Ein BindingExpression -Objekt abgerufen werden kann, durch den Rückgabewert des Aufrufs GetBindingExpression auf einem datengebundenen Objekt.A BindingExpression object can be obtained through the return value of calling GetBindingExpression on a data-bound object. In den folgenden Themen veranschaulichen einige Verwendungsmöglichkeiten der der BindingExpression Klasse:The following topics demonstrate some of the usages of the BindingExpression class:

DatenkonvertierungData Conversion

Im vorherigen Beispiel ist die Schaltfläche Rot da seine Background Eigenschaft an eine Zeichenfolgeneigenschaft mit dem Wert "Red" gebunden ist.In the previous example, the button is red because its Background property is bound to a string property with the value "Red". Dies funktioniert, weil ein Typkonverter auf vorhanden ist, wird die Brush Typ, den Zeichenfolgenwert, konvertiert ein Brush.This works because a type converter is present on the Brush type to convert the string value to a Brush.

Wenn diese Informationen der Abbildung im Abschnitt Erstellen einer Bindung hinzugefügt werden, sieht das Diagramm folgendermaßen aus:To add this information to the figure in the Creating a Binding section, the diagram looks like the following:

Das Diagramm, das die Standardeigenschaft für die Datenbindung anzeigt.

Jedoch, was geschieht, wenn statt einer Eigenschaft vom Typzeichenfolge das Bindungsquellobjekt hat eine Farbe Eigenschaft vom Typ Color?However, what if instead of having a property of type string your binding source object has a Color property of type Color? In diesem Fall, in der Reihenfolge für die Bindung funktioniert Sie müssen zuerst die Farbe in einen Eigenschaftswert, der die Background Eigenschaft akzeptiert.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. Sie müssen einen benutzerdefinierten Konverter erstellen, durch die Implementierung der IValueConverter -Schnittstelle, wie im folgenden Beispiel gezeigt: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

Die IValueConverter -Referenzseite finden Sie weitere Informationen.The IValueConverter reference page provides more information.

Jetzt wird anstelle der Standardkonvertierung der benutzerdefinierte Konverter verwendet, und unser Diagramm sieht wie folgt aus:Now the custom converter is used instead of default conversion, and our diagram looks like this:

Das Diagramm, das die benutzerdefinierte Bindung Datenkonverter anzeigt.

Wie bereits ausgeführt, können aufgrund von Typkonvertern, die im Typ vorhanden sind, an den gebunden wird, Standardkonvertierungen verfügbar sein.To reiterate, default conversions may be available because of type converters that are present in the type being bound to. Dieses Verhalten hängt von den im Ziel vorhandenen Typkonvertern ab.This behavior will depend on which type converters are available in the target. Erstellen Sie im Zweifelsfall einen eigenen Konverter.If in doubt, create your own converter.

Es folgen einige typische Szenarien, in denen die Implementierung eines Datenkonverters sinnvoll ist:Following are some typical scenarios where it makes sense to implement a data converter:

  • Die Daten sollen je nach Kultur unterschiedlich angezeigt werden.Your data should be displayed differently, depending on culture. Sie können z. B. einen Währungskonverter oder einen Datum-/Uhrzeitkonverter implementieren, der auf den Werten oder Standards basiert, die in einer bestimmten Kultur verwendet werden.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.

  • Die verwendeten Daten müssen nicht unbedingt dazu dienen, den Textwert einer Eigenschaft zu ändern. Sie können auch den Zweck haben, andere Werte zu ändern, beispielsweise die Quelle für ein Bild oder die Farbe bzw. das Format des Anzeigetexts.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. Konverter können in dieser Instanz verwendet werden, indem die Bindung einer Eigenschaft konvertiert wird, die ungeeignet zu sein scheint, z. B. wenn ein Textfeld an die Background-Eigenschaft einer Tabellenzelle gebunden wird.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.

  • Mehrere Steuerelemente oder mehrere Steuerelementeigenschaften sind an dieselben Daten gebunden.More than one control or to multiple properties of controls are bound to the same data. In diesem Fall wird durch die primäre Bindung möglicherweise nur der Text angezeigt, wohingegen andere Bindungen bestimmte Anzeigeprobleme behandeln, aber dieselben Bindungen als Quellinformationen verwenden.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.

  • Bisher haben nicht noch erörtert MultiBinding, wobei eine Zieleigenschaft eine Auflistung von Bindungen hat.So far we have not yet discussed MultiBinding, where a target property has a collection of bindings. Im Fall von einem MultiBinding, verwenden Sie eine benutzerdefinierte IMultiValueConverter um einen endgültigen Wert aus den Werten der Bindungen zu erstellen.In the case of a MultiBinding, you use a custom IMultiValueConverter to produce a final value from the values of the bindings. So kann die Farbe beispielsweise aus roten, blauen und grünen Werten berechnet werden, die aus denselben oder anderen Bindungsquellobjekten stammen können.For example, color may be computed from red, blue, and green values, which can be values from the same or different binding source objects. Finden Sie unter den MultiBinding -klassenseite Beispiele und Informationen.See the MultiBinding class page for examples and information.

Binden an AuflistungenBinding to Collections

Ein Bindungsquellobjekt kann als einzelnes Objekt behandelt werden, dessen Eigenschaften Daten enthalten, oder als eine Datenauflistung von polymorphen Objekten, die häufig zusammen gruppiert werden (beispielsweise als Ergebnis einer Datenbankabfrage).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). Bisher wurde nur das Binden an einzelne Objekte behandelt, aber auch das Binden an eine Datenauflistung ist ein gängiges Szenario.So far we've only discussed binding to single objects, however, binding to a data collection is a common scenario. Z. B. ein häufiges Szenario ist die Verwendung einer ItemsControl wie z. B. eine ListBox, ListView, oder TreeView um eine datenauflistung anzuzeigen, wie gezeigt in der Anwendung in der Was ist Datenbindung? Abschnitt.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.

Das bisherige einfache Diagramm ist praktischerweise immer noch gültig.Fortunately, our basic diagram still applies. Wenn Sie binden ein ItemsControl auf eine Auflistung, das Diagramm sieht wie folgt aus:If you are binding an ItemsControl to a collection, the diagram looks like this:

Diagramm, das zeigt, das die Datenbindung ItemsControl-Objekt.

Wie in diesem Diagramm dargestellt, zum Binden einer ItemsControl an ein Auflistungsobjekt ItemsSource Eigenschaft ist die Eigenschaft zu verwenden.As shown in this diagram, to bind an ItemsControl to a collection object, ItemsSource property is the property to use. Sie können sich vorstellen ItemsSource Eigenschaft als Inhalt der ItemsControl.You can think of ItemsSource property as the content of the ItemsControl. Beachten Sie, dass die Bindung OneWay da die ItemsSource Eigenschaft unterstützt OneWay standardmäßig binden.Note that the binding is OneWay because the ItemsSource property supports OneWay binding by default.

Implementieren von AuflistungenHow to Implement Collections

Sie können jede Auflistung, die implementiert Auflisten der IEnumerable Schnittstelle.You can enumerate over any collection that implements the IEnumerable interface. Allerdings um dynamische Bindungen einzurichten, sodass einfügungen oder löschungen in der Sammlung aktualisieren die UIUI automatisch die Sammlung implementieren muss die INotifyCollectionChanged Schnittstelle.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. Diese Schnittstelle macht ein Ereignis verfügbar, das bei jeder Änderung der zugrunde liegenden Auflistung ausgelöst werden sollte.This interface exposes an event that should be raised whenever the underlying collection changes.

WPFWPF Stellt die ObservableCollection<T> -Klasse, die integrierte Implementierung einer datenauflistung, die verfügbar macht, ist die INotifyCollectionChanged Schnittstelle.provides the ObservableCollection<T> class, which is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. Beachten Sie, um die Übertragung von Datenwerten von Quellobjekten zu Zielen vollständig zu unterstützen, jedes Objekt in der Auflistung, die bindbare Eigenschaften unterstützt auch implementieren muss, die INotifyPropertyChanged Schnittstelle.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. Weitere Informationen finden Sie unter Übersicht über Bindungsquellen.For more information, see Binding Sources Overview.

Bevor Sie eine eigene Auflistung implementieren, erwägen Sie ObservableCollection<T> oder einer vorhandenen Sammlung Klassen, z. B. List<T>, Collection<T>, und BindingList<T>, a.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. Wenn Sie ein erweitertes Szenario und Ihre eigene Auflistung implementieren möchten, erwägen Sie die Verwendung IList, dem bietet es sich um einer nicht generische Auflistung von Objekten, die durch den Index und somit die beste Leistung einzeln zugegriffen werden kann.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.

AuflistungsansichtenCollection Views

Sobald Ihre ItemsControl gebunden an eine datenauflistung, Sie sollten zu sortieren, filtern oder Gruppieren der Daten ist.Once your ItemsControl is bound to a data collection, you may want to sort, filter, or group the data. Zu diesem Zweck verwenden Sie Auflistungsansichten, bei denen Klassen handelt, implementieren die ICollectionView Schnittstelle.To do that, you use collection views, which are classes that implement the ICollectionView interface.

Was sind Auflistungsansichten?What Are Collection Views?

Eine Auflistungsansicht fungiert als Ebene über der Bindungsquellauflistung, in der Sie mit Sortier-, Filter- und Gruppierungsabfragen navigieren und die jeweilige Quellauflistung anzeigen können, ohne die zugrunde liegende Quellauflistung selbst ändern zu müssen.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. Eine Auflistungsansicht stellt außerdem einen Zeiger auf das aktuelle Element in der Auflistung zur Verfügung.A collection view also maintains a pointer to the current item in the collection. Wenn die quellauflistung implementiert die INotifyCollectionChanged Schnittstelle, die Änderungen, die ausgelöst wird, indem die CollectionChanged Ereignis an die Ansichten weitergegeben werden.If the source collection implements the INotifyCollectionChanged interface, the changes raised by the CollectionChanged event are propagated to the views.

Da in Ansichten die zugrunde liegenden Quellauflistungen nicht geändert werden, können einer Quellauflistung mehrere Ansichten zugeordnet sein.Because views do not change the underlying source collections, each source collection can have multiple views associated with it. Angenommen, Sie verfügen über eine Auflistung von Task-Objekten.For example, you may have a collection of Task objects. Mithilfe von Ansichten können Sie dieselben Daten auf verschiedene Weise anzeigen.With the use of views, you can display that same data in different ways. Beispielsweise können Sie links auf der Seite Aufgaben nach Priorität und rechts nach Bereich sortieren.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.

Erstellen einer AnsichtHow to Create a View

Eine Möglichkeit, eine Ansicht zu erstellen und zu verwenden, besteht darin, das Ansichtsobjekt direkt zu instanziieren und dann als Bindungsquelle zu verwenden.One way to create and use a view is to instantiate the view object directly and then use it as the binding source. Betrachten Sie z. B. die Anwendung Demo für die Datenbindung, die im Abschnitt Was ist Datenbindung? gezeigt wird.For example, consider the Data Binding Demo application shown in the What Is Data Binding? section. Die Anwendung implementiert wird, dass die ListBox bindet an eine Ansicht über die Datensammlung anstelle der Erfassung direkt.The application is implemented such that the ListBox binds to a view over the data collection instead of the data collection directly. Das folgende Beispiel wird aus der Demo für die Datenbindung-Anwendung extrahiert.The following example is extracted from the Data Binding Demo application. Die CollectionViewSource -Klasse ist die Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) Proxy einer Klasse, die von erbt CollectionView.The CollectionViewSource class is the Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) proxy of a class that inherits from CollectionView. In diesem Beispiel ist die Source der Ansicht gebunden ist die AuctionItems Auflistung (des Typs ObservableCollection<T>) des aktuellen Anwendungsobjekts.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>

Die Ressource ListingDataView dient dann als Bindungsquelle für Elemente in der Anwendung, z. B. die 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>

Um eine andere Ansicht für dieselbe Sammlung zu erstellen, können Sie erstellen Sie eine weitere CollectionViewSource -Instanz, und weisen Sie ihm einen anderen x:Key Name.To create another view for the same collection, you can create another CollectionViewSource instance and give it a different x:Key name.

Die folgende Tabelle zeigt, welche Ansichtsdatentypen als Standardauflistungsansicht an oder von erstellte CollectionViewSource basierend auf dem Quellauflistungstyp.The following table shows which view data types are created as the default collection view or by CollectionViewSource based on the source collection type.

QuellauflistungstypSource collection type AuflistungsansichtstypCollection view type HinweiseNotes
IEnumerable Ein interner Typ basierend auf CollectionViewAn internal type based on CollectionView Kann Elemente nicht gruppieren.Cannot group items.
IList ListCollectionView Am schnellsten.Fastest.
IBindingList BindingListCollectionView
Verwenden einer StandardansichtUsing a Default View

Die Angabe einer Auflistungsansicht als Bindungsquelle ist eine Möglichkeit, eine Auflistungsansicht zu erstellen und zu verwenden.Specifying a collection view as a binding source is one way to create and use a collection view. WPF erstellt außerdem eine Standardauflistungsansicht für jede als Bindungsquelle verwendete Auflistung.WPF also creates a default collection view for every collection used as a binding source. Bei der direkten Bindung an eine Auflistung bindet WPF an die Standardansicht der Auflistung.If you bind directly to a collection, WPF binds to its default view. Diese Standardansicht wird von allen Bindungen an diese Auflistung gemeinsam verwendet, sodass eine Änderung an der Standardansicht durch ein gebundenes Steuerelement oder Code, z. B. Sortierung oder eine Änderung des aktuellen Elementzeigers (dies wird zu einem späteren Zeitpunkt erläutert), sich auf alle anderen Bindungen an dieselbe Auflistung auswirkt.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.

Rufen Sie die Standardansicht, die Sie mit der GetDefaultView Methode.To get the default view, you use the GetDefaultView method. Ein Beispiel finden Sie unter Abrufen der Standardansicht einer Datenauflistung.For an example, see Get the Default View of a Data Collection.

Auflistungsansichten mit ADO.NET-DatentabellenCollection Views with ADO.NET DataTables

Zur Verbesserung der Leistung der Auflistung Ansichten für ADO.NET DataTable oder DataView Objekten delegieren, Sortierung und Filterung an die DataView.To improve performance, collection views for ADO.NET DataTable or DataView objects delegate sorting and filtering to the DataView. So wird die Sortierung und Filterung von allen Auflistungsansichten der Datenquelle gemeinsam verwendet.This causes sorting and filtering to be shared across all collection views of the data source. Um jede Auflistungsansicht, Sortierung und Filterung zu aktivieren, initialisieren Sie jede Auflistungsansicht mit eigenem DataView Objekt.To enable each collection view to sort and filter independently, initialize each collection view with its own DataView object.

SortierenSorting

Wie bereits erwähnt, können mit Ansichten Sortierreihenfolgen auf Auflistungen angewendet werden.As mentioned before, views can apply a sort order to a collection. Da sie in der zugrunde liegenden Auflistung vorhanden sind, haben die Daten möglicherweise eine relevante inhärente Reihenfolge oder nicht.As it exists in the underlying collection, your data may or may not have a relevant, inherent order. Die Ansicht der Auflistung ermöglicht Ihnen das Festlegen einer Reihenfolge oder das Ändern der Standardreihenfolge, je nachdem, welche Vergleichskriterien Sie angeben.The view over the collection allows you to impose an order, or change the default order, based on comparison criteria that you supply. Da es sich um eine clientbasierte Ansicht der Daten handelt, besteht ein übliches Szenario darin, dass der Benutzer Spalten mit Tabellendaten nach dem Wert sortiert, dem die Spalte entspricht.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. Mithilfe von Ansichten kann diese benutzerdefinierte Sortierung angewendet werden, ohne die zugrunde liegende Auflistung ändern oder den Auflistungsinhalt erneut abfragen zu müssen.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. Ein Beispiel finden Sie unter Sortieren einer GridView-Spalte beim Klicken auf einen Header.For an example, see Sort a GridView Column When a Header Is Clicked.

Das folgende Beispiel zeigt die Sortierlogik des der "Sort by Category and Date" CheckBox der Anwendung UIUI in die Was ist Datenbindung? Abschnitt: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

FilternFiltering

Ansichten können auch einen Filter auf eine Auflistung anwenden.Views can also apply a filter to a collection. Dies bedeutet, dass in der Auflistung zwar ein Element vorhanden sein kann, in dieser bestimmten Ansicht jedoch nur eine bestimmte Teilmenge der gesamten Auflistung angezeigt werden soll.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. Sie können die Daten nach einer Bedingung filtern.You might filter on a condition in the data. Beispielsweise erfolgt wie von der Anwendung in der Was ist Datenbindung? im Abschnitt "Show only Bargains" CheckBox enthält die Logik, um Elemente zu filtern, die $25 oder mehr Kosten.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. Der folgende Code wird ausgeführt, um ShowOnlyBargainsFilter als die Filter Ereignishandler beim, CheckBox ausgewählt ist: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

Die ShowOnlyBargainsFilter-Ereignishandler hat folgende Implementierung: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

Wenn Sie eine der verwenden die CollectionView direkt anstelle von Klassen CollectionViewSource, verwenden Sie die Filter Eigenschaft zum Angeben eines Rückrufs.If you are using one of the CollectionView classes directly instead of CollectionViewSource, you would use the Filter property to specify a callback. Ein Beispiel finden Sie unter Filtern von Daten in einer Ansicht.For an example, see Filter Data in a View.

GruppierenGrouping

Mit Ausnahme der internen Klasse zur Ansicht eine IEnumerable Auflistung unterstützen alle Auflistungsansichten Gruppierungsfunktionen, die dem Benutzer ermöglicht, die die Auflistung in der Auflistungsansicht in logische Gruppen unterteilen.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. Die Gruppen können explizit sein, wobei Benutzer eine Liste von Gruppen angeben. Sie können auch implizit sein, wobei die Gruppen dynamisch in Abhängigkeit von den Daten generiert werden.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.

Das folgende Beispiel zeigt die Logik der "Group by Category" 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)

Ein weiteres Beispiel zu Gruppierungen finden Sie unter Gruppieren von Elementen in einem ListView, in dem ein GridView implementiert ist.For another grouping example, see Group Items in a ListView That Implements a GridView.

Zeiger auf aktuelle ElementeCurrent Item Pointers

Ansichten unterstützen ebenfalls das Konzept eines aktuellen Elements.Views also support the notion of a current item. Sie können durch die Objekte in einer Auflistungsansicht navigieren.You can navigate through the objects in a collection view. Beim Navigieren verschieben Sie einen Elementzeiger, mit dem Sie das Objekt abrufen können, das sich an einer bestimmten Position in der Auflistung befindet.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. Ein Beispiel finden Sie unter Navigieren durch die Objekte in einer Datenauflistungsansicht.For an example, see Navigate Through the Objects in a Data CollectionView.

Da WPF Bindungen an Auflistungen immer über Ansichten herstellt (entweder über eine von Ihnen erstellte Ansicht oder über die Standardansicht der jeweiligen Auflistung), verfügen alle Bindungen an Auflistungen über einen Zeiger auf das aktuelle Element.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. Bei der Bindung an eine Ansicht gibt der Schrägstrich ("/") im Path-Wert das aktuelle Element der Ansicht an.When binding to a view, the slash ("/") character in a Path value designates the current item of the view. Der Datenkontext im folgenden Beispiel ist eine Auflistungsansicht.In the following example, the data context is a collection view. Die erste Zeile wird an die Auflistung gebunden.The first line binds to the collection. Die zweite Zeile wird an das aktuelle Element in der Auflistung gebunden.The second line binds to the current item in the collection. Die dritte Zeile wird an die Description-Eigenschaft des aktuellen Elements in der Auflistung gebunden.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}" />   

Der Schrägstrich und die Eigenschaftensyntax können gestapelt werden, um eine Hierarchie von Auflistungen zu durchlaufen.The slash and property syntax can also be stacked to traverse a hierarchy of collections. Im folgenden Beispiel erfolgt die Bindung an das aktuelle Element einer Auflistung mit dem Namen Offices, wobei es sich um eine Eigenschaft des aktuellen Elements der Quellauflistung handelt.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/}" />  

Der Zeiger auf das aktuelle Element kann durch eine Sortierung oder Filterung beeinflusst werden, die auf die Auflistung angewendet wird.The current item pointer can be affected by any sorting or filtering that is applied to the collection. Beim Sortieren verbleibt der Zeiger für das aktuelle Element auf dem zuletzt ausgewählten Element, die Auflistungsansicht wird jedoch nun um den Zeiger herum neu angeordnet.Sorting preserves the current item pointer on the last item selected, but the collection view is now restructured around it. (Möglicherweise befand sich das ausgewählte Element zuvor am Anfang der Liste, jetzt aber in der Mitte.) Beim Filtern wird das ausgewählte Element beibehalten, wenn diese Auswahl nach dem Filtern in der Ansicht verbleibt.(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. Andernfalls wird der Zeiger für das aktuelle Element auf das erste Element der gefilterten Auflistungsansicht festgelegt.Otherwise, the current item pointer is set to the first item of the filtered collection view.

Szenario für Master-Detail-BindungMaster-Detail Binding Scenario

Das Konzept eines aktuellen Elements ist nicht nur hilfreich, um durch Elemente in einer Auflistung zu navigieren, sondern auch für das Szenario einer Master-Detail-Bindung.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. Betrachten Sie wieder die UIUI der Anwendung, die im Abschnitt Was ist Datenbindung? verwendet wird.Consider the application UIUI in the What Is Data Binding? section again. In dieser Anwendung wird die Auswahl in der ListBox bestimmt den Inhalt, dargestellt der ContentControl.In that application, the selection within the ListBox determines the content shown in the ContentControl. Ausgedrückt in eine andere Möglichkeit, wenn eine ListBox Element ausgewählt ist, die ContentControl zeigt die Details des ausgewählten Elements.To put it in another way, when a ListBox item is selected, the ContentControl shows the details of the selected item.

Sie können das Master-Detail-Szenario auch einfach dadurch implementieren, dass mindestens zwei Steuerelemente an dieselbe Ansicht gebunden sind.You can implement the master-detail scenario simply by having two or more controls bound to the same view. Im folgenden Beispiel aus der Demo für die Datenbindung zeigt das Markup der der ListBox und ContentControl Sie in der Anwendung finden Sie unter UIUI in die Was ist Datenbindung? Abschnitt: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"/>

Beachten Sie, dass beide Steuerelemente an dieselbe Quelle gebunden sind, und zwar die statische listingDataView-Ressource (siehe die Definition dieser Ressource im Abschnitt Erstellen einer Ansicht).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). Dies funktioniert, da bei der ein Singleton-Objekt (die ContentControl in diesem Fall) gebunden ist, eine Auflistungsansicht automatisch bindet an die CurrentItem der Ansicht.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. Beachten Sie, dass CollectionViewSource -Objekte Währung und Auswahl automatisch zu synchronisieren.Note that CollectionViewSource objects automatically synchronize currency and selection. Wenn Ihr Listensteuerelement, nicht gebunden ist eine CollectionViewSource Objekt wie in diesem Beispiel ist, dann Sie festlegen müssen seiner IsSynchronizedWithCurrentItem Eigenschaft true damit dies funktioniert.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.

Weitere Beispiele finden Sie unter Binden an eine Auflistung und Anzeigen von Informationen auf Grundlage der Auswahl und Verwenden des Master/Detail-Musters mit hierarchischen Daten.For other examples, see Bind to a Collection and Display Information Based on Selection and Use the Master-Detail Pattern with Hierarchical Data.

Ihnen ist vielleicht aufgefallen, dass im vorherigen Beispiel eine Vorlage verwendet wird.You may have noticed that the above example uses a template. In der Tat die Daten werden nicht angezeigt wie wir, ohne die Verwendung von Vorlagen möchten (explizit verwendet, durch die ContentControl und die andere implizit von der 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). Im nächsten Abschnitt beschäftigen wir uns mit Datenvorlagen.We now turn to data templating in the next section.

DatenvorlagenData Templating

Ohne Datenvorlagen würde die UIUI der Anwendung im Abschnitt Was ist Datenbindung? wie folgt aussehen:Without the use of data templates, our application UIUI in the What Is Data Binding? section would look like the following:

Demobeispiel für Datenbindung ohne Datenvorlagen

Wie im Beispiel im vorherigen Abschnitt gezeigt sowohl die ListBox Steuerelement und die ContentControl gebunden sind, um das gesamte Objekt (oder genauer gesagt: die Ansicht Auflistungsobjekts) von 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. Ohne spezielle Vorgehensweise beim Anzeigen der Datensammlung, das die der ListBox eine Zeichenfolgendarstellung der einzelnen Objekte in der zugrunde liegenden Auflistung anzeigt und die ContentControl angezeigt, eine Zeichenfolgendarstellung für das Objekt, das es gebunden ist.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.

Um dieses Problem zu beheben, die Anwendung definiert DataTemplates.To solve that problem, the application defines DataTemplates. Wie im Beispiel im vorherigen Abschnitt gezeigt die ContentControl verwendet explizit den DetailsProductListingTemplateDataTemplate.As shown in the example in the previous section, the ContentControl explicitly uses the detailsProductListingTemplateDataTemplate. Die ListBox -Steuerelement verwendet implizit folgende DataTemplate beim Anzeigen der AuctionItem Objekte in der Auflistung: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>

Mit der Verwendung dieser beiden DataTemplates, die resultierende Benutzeroberfläche ist dargestellt, der Was ist Datenbindung? Abschnitt.With the use of those two DataTemplates, the resulting UI is the one shown in the What Is Data Binding? section. Wie Sie in dieser bildschirmabbildung sehen können, neben ermöglicht werden die Daten in die Steuerelemente DataTemplates können Sie ansprechende Visualisierungen für Ihre Daten zu definieren.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. Z. B. DataTriggers werden verwendet, in der obigen DataTemplate , damit AuctionItemmit SpecialFeatures Wert markieren angezeigt werden sollen, mit einer orangefarbenen Rahmen und einen Stern.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.

Weitere Informationen zu Datenvorlagen finden Sie in der Übersicht über Datenvorlagen.For more information about data templates, see the Data Templating Overview.

DatenvalidierungData Validation

Die meisten Anwendungen, bei denen Benutzereingaben erfolgen, benötigen Validierungslogik, um sicherzustellen, dass der Benutzer die erwarteten Informationen eingegeben hat.Most applications that take user input need to have validation logic to ensure that the user has entered the expected information. Die Validierungsprüfungen können auf Typ, Bereich, Format oder anderen anwendungsspezifischen Anforderungen basieren.The validation checks can be based on type, range, format, or other application-specific requirements. In diesem Abschnitt wird erklärt, wie Datenvalidierung in WPFWPF funktioniert.This section discusses how data validation works in the WPFWPF.

Zuordnen von Validierungsregeln zu einer BindungAssociating Validation Rules with a Binding

Die WPFWPF -Datenbindungsmodell ermöglicht Ihnen die Zuordnung ValidationRules mit Ihrem Binding Objekt.The WPFWPF data binding model allows you to associate ValidationRules with your Binding object. Z. B. im folgenden Beispiel wird eine TextBox auf eine Eigenschaft mit dem Namen StartPrice und fügt eine ExceptionValidationRule -Objekt an die Binding.ValidationRules Eigenschaft.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>

Ein ValidationRule -Objekt überprüft, ob der Wert einer Eigenschaft gültig ist.A ValidationRule object checks whether the value of a property is valid. WPFWPF hat die folgenden zwei Arten von integrierten ValidationRule Objekte:has the following two types of built-in ValidationRule objects:

Sie können auch eigene Validierungsregeln erstellen, durch Ableiten von der ValidationRule -Klasse und Implementieren der Validate Methode.You can also create your own validation rule by deriving from the ValidationRule class and implementing the Validate method. Das folgende Beispiel zeigt die Regel ein, die die Add Product Listing "Start Date" TextBox aus der Was ist Datenbindung? Abschnitt: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

Die StartDateEntryForm TextBox verwendet diese FutureDateRule, wie im folgenden Beispiel gezeigt: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>

Beachten Sie, dass die UpdateSourceTrigger Wert PropertyChanged, die Bindungs-Engine aktualisiert dem Quellwert bei jeder Tastatureingabe und überprüft auch daher alle Regeln in der ValidationRules -Auflistung bei jeder Tastatureingabe.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. Dies wird im Abschnitt zum Validierungsprozess näher erläutert.We discuss this further in the Validation Process section.

Bereitstellen von visuellem FeedbackProviding Visual Feedback

Wenn der Benutzer einen ungültigen Wert eingibt, kann es sinnvoll sein, Feedback zum Fehler auf der UIUI der Anwendung zu geben.If the user enters an invalid value, you may want to provide some feedback about the error on the application UIUI. Eine Möglichkeit zum Bereitstellen von Feedback besteht darin, legen Sie die Validation.ErrorTemplate angefügte Eigenschaft auf eine benutzerdefinierte ControlTemplate.One way to provide such feedback is to set the Validation.ErrorTemplate attached property to a custom ControlTemplate. Wie im vorherigen Unterabschnitt gezeigt die StartDateEntryForm TextBox verwendet eine ErrorTemplate namens ValidationTemplate.As shown in the previous subsection, the StartDateEntryForm TextBox uses an ErrorTemplate called validationTemplate. Im folgenden Beispiel sehen Sie die Definition von validationTemplate:The following example shows the definition of validationTemplate:

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

Die AdornedElementPlaceholder Element gibt an, in dem das Steuerelement platziert werden soll.The AdornedElementPlaceholder element specifies where the control being adorned should be placed.

Darüber hinaus können Sie auch eine ToolTip um die Fehlermeldung anzuzeigen.In addition, you may also use a ToolTip to display the error message. Sowohl die StartDateEntryForm und StartPriceEntryFormTextBoxverwenden das Format TextStyleTextBox, erstellt eine ToolTip , Zeigt die Fehlermeldung an.Both the StartDateEntryForm and the StartPriceEntryFormTextBoxes use the style textStyleTextBox, which creates a ToolTip that displays the error message. Im folgenden Beispiel wird die Definition von textStyleTextBox dargestellt.The following example shows the definition of textStyleTextBox. Die angefügte Eigenschaft HasError ist true Wenn mindestens eine der Bindungen in den Eigenschaften des gebundenen Elements fehlerhaft sind.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>

Mit dem benutzerdefinierten ErrorTemplate und ToolTip, StartDateEntryForm TextBox sieht wie folgt aus, wenn ein Überprüfungsfehler vorhanden ist:With the custom ErrorTemplate and the ToolTip, the StartDateEntryForm TextBox looks like the following when there is a validation error:

Fehler bei der DatenbindungsvalidierungData binding validation error

Wenn Ihre Binding über zugeordnete Validierungsregeln, aber nicht angeben einer ErrorTemplate für das gebundene Steuerelement ein, den Standardwert ErrorTemplate wird verwendet, um Benutzer zu benachrichtigen, wenn ein Überprüfungsfehler vorliegt.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. Der Standardwert ErrorTemplate ist eine Steuerelementvorlage, die einen roten Rahmen in der Adornerebene definiert.The default ErrorTemplate is a control template that defines a red border in the adorner layer. Mit der standardmäßigen ErrorTemplate und ToolTip, wird die UIUI von der StartPriceEntryForm TextBox sieht wie folgt aus, wenn ein Überprüfungsfehler vorhanden ist:With the default ErrorTemplate and the ToolTip, the UIUI of the StartPriceEntryForm TextBox looks like the following when there is a validation error:

Fehler bei der DatenbindungsvalidierungData binding validation error

Ein Beispiel zum Bereitstellen von Logik zum Validieren aller Steuerelemente in einem Dialogfeld finden Sie im Abschnitt zu benutzerdefinierten Dialogfeldern in der Übersicht über Dialogfelder.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.

ValidierungsprozessValidation Process

Eine Validierung erfolgt normalerweise, wenn der Wert eines Ziels an die Bindungsquelleigenschaft übergeben wird.Validation usually occurs when the value of a target is transferred to the binding source property. In diesem Fall auf TwoWay und OneWayToSource Bindungen.This occurs on TwoWay and OneWayToSource bindings. Wie bereits ausgeführt, wodurch wird eine Aktualisierung einer Quelle hängt vom Wert von der UpdateSourceTrigger -Eigenschaft, wie in beschrieben die Quellaktualisierungen ausgelöst Abschnitt.To reiterate, what causes a source update depends on the value of the UpdateSourceTrigger property, as described in the What Triggers Source Updates section.

Im Folgenden wird der Prozess der Validierung beschrieben.The following describes the validation process. Beachten Sie, dass der Prozess beim Auftreten eines Validierungs- oder anderen Fehlers in seinem Verlauf angehalten wird.Note that if a validation error or other type of error occurs at any time during this process, the process is halted.

  1. Die Bindungs-Engine überprüft, ob alle benutzerdefinierten ValidationRule Objekte definiert sind, dessen ValidationStep nastaven NA hodnotu RawProposedValue , Binding, in diesem Fall ruft die Validate -Methode für jede ValidationRule erst beim Ausführen eines einen Fehler oder bis alle Regeln erfolgreich.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. Anschließend ruft die Bindungs-Engine den Konverter auf, sofern vorhanden.The binding engine then calls the converter, if one exists.

  3. Wenn der Konverter erfolgreich ist, wird die Bindungs-Engine überprüft, ob benutzerdefinierte ValidationRule Objekte definiert sind, dessen ValidationStep nastaven NA hodnotu ConvertedProposedValue , Binding, in diesem Fall ruft die Validate -Methode für jede ValidationRule , bei dem ValidationStep festgelegt ConvertedProposedValue bis einer davon ein Fehler ausgeführt wird oder alle Regeln erfolgreich.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. Die Bindungs-Engine legt die Quelleigenschaft fest.The binding engine sets the source property.

  5. Die Bindungs-Engine überprüft, ob alle benutzerdefinierten ValidationRule Objekte definiert sind, dessen ValidationStep nastaven NA hodnotu UpdatedValue , Binding, in diesem Fall ruft die Validate -Methode für jede ValidationRule , bei dem ValidationStep festgelegt UpdatedValue bis einer davon ein Fehler ausgeführt wird oder alle Regeln erfolgreich.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. Wenn eine DataErrorValidationRule bezieht sich auf einer Bindung und die zugehörige ValidationStep auf den Standardwert festgelegt ist UpdatedValue, DataErrorValidationRule an diesem Punkt aktiviert ist.If a DataErrorValidationRule is associated with a binding and its ValidationStep is set to the default, UpdatedValue, the DataErrorValidationRule is checked at this point. Dies ist auch der Punkt bei Bindungen, die die ValidatesOnDataErrors festgelegt true überprüft werden.This is also the point when bindings that have the ValidatesOnDataErrors set to true are checked.

  6. Die Bindungs-Engine überprüft, ob alle benutzerdefinierten ValidationRule Objekte definiert sind, dessen ValidationStep nastaven NA hodnotu CommittedValue , Binding, in diesem Fall ruft die Validate -Methode für jede ValidationRule , bei dem ValidationStep festgelegt CommittedValue bis einer davon ein Fehler ausgeführt wird oder alle Regeln erfolgreich.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.

Wenn eine ValidationRule übergibt die nicht zu einem beliebigen Zeitpunkt während dieses Prozesses, erstellt die Bindungs-Engine eine ValidationError -Objekt und fügt es der Errors -Auflistung des gebundenen Elements.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. Bevor Sie die Bindung-Engine ausgeführt wird die ValidationRule Objekte im Rahmen eines Schritts entfernt alle ValidationError , hinzugefügt wurde die Errors angefügte Eigenschaft des gebundenen Elements während dieses Schritts.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. Z. B. wenn ein ValidationRule , deren ValidationStep nastaven NA hodnotu UpdatedValue fehlgeschlagen ist, wird das nächste Mal den Prozess der Validierung auftritt, die Bindungs-Engine entfernt werden, die ValidationError unmittelbar vor dem Aufruf ValidationRule , bei dem ValidationStep festgelegt UpdatedValue.For 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.

Wenn Errors ist nicht leer ist, die HasError angefügte Eigenschaft des Elements nastaven NA hodnotu true.When Errors is not empty, the HasError attached property of the element is set to true. Auch wenn die NotifyOnValidationError Eigenschaft der Binding nastaven NA hodnotu true, löst die Bindungs-Engine die Validation.Error angefügtes Ereignis für das Element.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.

Beachten Sie auch, die eine Übertragung gültigen Wert in beide Richtungen (Ziel zu Quelle oder Ziel) Löscht die Errors angefügte Eigenschaft.Also note that a valid value transfer in either direction (target to source or source to target) clears the Errors attached property.

Die Bindung verfügt entweder ein ExceptionValidationRule zugeordnet, oder Sie haben die ValidatesOnExceptions -Eigenschaftensatz auf true und die Bindungs-Engine eine Ausnahme wird ausgelöst, wenn die Bindungs-Engine die Quelle festlegt, überprüft werden, um festzustellen, ob eine 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. Sie haben die Möglichkeit zum Verwenden der UpdateSourceExceptionFilter Rückruf, der einen benutzerdefinierten Handler zum Behandeln von Ausnahmen angeben.You have the option to use the UpdateSourceExceptionFilter callback to provide a custom handler for handling exceptions. Wenn ein UpdateSourceExceptionFilter nicht angegeben ist, auf die Binding, erstellt die Bindungs-Engine eine ValidationError mit der Ausnahme und fügt es der Errors -Auflistung des gebundenen Elements.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.

DebugverfahrenDebugging Mechanism

Sie können die angefügte Eigenschaft festlegen TraceLevel für ein Objekt Datenbindung, um Informationen über den Status einer bestimmten Bindung zu erhalten.You can set the attached property TraceLevel on a binding-related object to receive information about the status of a specific binding.

Siehe auchSee also