Ü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)-Objekten und XMLXMLgebunden werden.Elements can be bound to data from a variety of data sources in the form of common language runtime (CLR) objects and XMLXML. ContentControlz Button . b. ItemsControlund s, ListBox wie ListView z. b. und, verfügen über integrierte Funktionen, die eine flexible Formatierung einzelner Datenelemente oder Auflistungen von Datenelementen ermöglichen.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 werden zunächst die Grund WPFWPF Legenden Konzepte für die Datenbindung erläutert. Anschließend wird Binding die Verwendung der-Klasse und anderer Funktionen der Datenbindung erläutert.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. Wenn der Benutzer z. b. den Wert in einem TextBox -Element bearbeitet, wird der zugrunde liegende Datenwert automatisch aktualisiert, um die Änderung widerzuspiegeln.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 WPFWPFkönnen Abhängigkeits Eigenschaften von Elementen an CLR-Objekte (einschließlich ADO.NET-Objekten oder-Objekten, die Webdiensten und Webeigenschaften zugeordnet sind) und XMLXML Daten gebunden werden.In WPFWPF, dependency properties of elements can be bound to CLR objects (including ADO.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:

Screenshot: Beispiel für DatenbindungData 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:

  • Der Inhalt von ListBox ist an eine Auflistung von AuctionItem -Objekten gebunden.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 in der ListBox angezeigten Daten (Auktions Element Objekte) werden Vorlagen Weise angezeigt, sodass die Beschreibung und der aktuelle 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 die Daten mithilfe der CheckBoxangegebenen es gruppieren, Filtern oder sortieren.The user can group, filter, or sort the data using the CheckBoxes provided. In der obigen Abbildung sind die Elemente "Gruppieren nach Kategorie" und "nach Kategorie und Datum CheckBoxsortieren" ausgewählt.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 auswählt, ContentControl zeigt die Details des ausgewählten Elements an.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 der StartDate -Eigenschaft ist DateTime. dieser gibt ein Datum zurück, das die Zeit bis zur Millisekunde enthält.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.

Nicht in diesem Bild angezeigt wird, ist die Validierungs Logik, die im Start Datum TextBoxbereitgestellt wird.Not shown in this image is the validation logic provided in the Start Date TextBox. Wenn der Benutzer ein ungültiges Datum eingibt (ungültige Formatierung oder letztes Datum), wird der Benutzer mit einem ToolTip und einem roten Ausrufezeichen neben dem TextBoxbenachrichtigt.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:

Diagramm, das das grundlegende Daten Bindungs Modell zeigt.

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. Wenn Sie z. b. den Inhalt TextBox einer an die Name -Eigenschaft eines Employee -Objekts binden möchten, ist das Zielobjekt das TextBox. die Ziel Eigenschaft ist die Text -Eigenschaft, der zu verwendende Wert ist Nameund die das Quell Objekt ist das Employee -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 UIElement meisten Eigenschaften sind Abhängigkeits Eigenschaften und die meisten Abhängigkeits Eigenschaften, mit Ausnahme der schreibgeschützten Eigenschaften, unterstützen standardmäßig die Datenbindung.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ängigkeits Eigenschaften definieren UIElement, und alle DependencyObjects werden von abgeleitet.)(Only DependencyObject types can define dependency properties and all UIElements derive from DependencyObject.)

  • Obwohl nicht in der Abbildung angegeben, sollte beachtet werden, dass das Bindungs Quell Objekt nicht auf ein benutzerdefiniertes CLR-Objekt beschränkt ist.Although not specified in the figure, it should be noted that the binding source object is not restricted to being a custom CLR object. WPFWPFdie Datenbindung unterstützt Daten in Form von CLR- XMLXMLObjekten und.data binding supports data in the form of CLR objects and XMLXML. Um einige Beispiele anzugeben, kann die Bindungs Quelle ein UIElement, ein beliebiges Listen Objekt, ein CLR-Objekt, das ADO.NET-Daten oder Webdiensten zugeordnet ist, oder ein XmlNode-Objekt sein, das Ihre XMLXML Daten enthält.To provide some examples, your binding source may be a UIElement, any list object, a CLR object that is associated with ADO.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 SDK-Themen ist es wichtig zu beachten, dass beim Einrichten einer Bindung ein Bindungs Ziel an eine Bindungs Quelle gebunden wird.As you read through other SDK topics, it is important to remember that when you are establishing a binding, you are binding a binding target to a binding source. Wenn Sie z. b. einige zugrunde liegende XMLXML Daten in einem ListBox mithilfe der Datenbindung anzeigen, binden Sie ListBox ihre an XMLXML die 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.

Zum Einrichten einer Bindung verwenden Sie das Binding -Objekt.To establish a binding, you use the Binding object. Im restlichen Teil dieses Themas werden viele der mit und einigen der Eigenschaften und der Verwendung des Binding Objekts verknüpften Konzepte erläutert.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 obigen Abbildung ersichtlich, kann der Datenfluss einer Bindung vom Bindungs Ziel zur Bindungs Quelle wechseln (z. b. ändert sich der Quellwert, wenn ein Benutzer den Wert eines TextBoxbearbeitet) und/oder aus der Bindungs Quelle. zum Bindungs Ziel (z TextBox . b. wird der Inhalt mit Änderungen in der Bindungs Quelle aktualisiert), wenn die Bindungs Quelle die richtigen 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, indem Sie Mode die-Eigenschaft Binding des-Objekts festlegen.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

  • OneWaydie Bindung bewirkt, dass Änderungen an der Quell Eigenschaft die Ziel Eigenschaft automatisch aktualisieren, aber Änderungen an der Ziel Eigenschaft werden nicht an die Quell Eigenschaft zurückgegeben.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.

  • TwoWaydie Bindung bewirkt, dass bei Änderungen an der Quell-oder der Ziel Eigenschaft die andere automatisch aktualisiert wird.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 werden OneWay standardmäßig gebunden, aber einige Abhängigkeits Eigenschaften (in der Regel Eigenschaften Benutzer bearbeitbarer Text Steuerelemente TextBox wie die-Eigenschaft CheckBoxvon und die IsChecked -Eigenschaft von) werden standardmäßig auf 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.

  • OneWayToSourceist die Umkehrung OneWay der Bindung; Sie aktualisiert die Quell Eigenschaft, wenn die Ziel Eigenschaft geändert wird.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 ist OneTime die Bindung nicht dargestellt, was bewirkt, dass die Quell Eigenschaft die Ziel Eigenschaft initialisiert. nachfolgende Änderungen werden jedoch 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 die Quelle zum Erkennen von OneWay Quell TwoWay Änderungen (anwendbar auf-und-Bindungen) einen geeigneten Benachrichtigungs Mechanismus für INotifyPropertyChangeddie Eigenschafts Änderung implementieren muss, z.b.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. Ein Beispiel für eine INotifyPropertyChanged -Implementierung finden Sie unter Implementieren von Benachrichtigungen über Eigenschafts Änderungen .See Implement Property Change Notification for an example of an INotifyPropertyChanged implementation.

Die Mode Eigenschaften Seite enthält weitere Informationen zu Bindungs Modi und ein Beispiel für die Angabe der Richtung einer Bindung.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, die TwoWay auf OneWayToSource Änderungen in der Ziel Eigenschaft warten oder diese überwachen und an die Quelle zurückgeben.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 letzten Abschnitt beschrieben, wird die Richtung des Datenflusses durch den Wert der Mode -Eigenschaft der-Bindung bestimmt.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 das Update der Quelle ausgelöst wird.The UpdateSourceTrigger property of the binding determines what triggers the update of the source. Die Punkte der nach rechts weisenden Pfeile in der folgenden Abbildung veranschaulichen die Rolle UpdateSourceTrigger der-Eigenschaft:The dots of the right arrows in the following figure illustrate the role of the UpdateSourceTrigger property:

Diagramm, das die Rolle der updatesourceauslösereigenschaft anzeigt.

Wenn der UpdateSourceTrigger Wert ist, wird der Wert, auf den der nach-rechts TwoWay -Pfeil OneWayToSource von oder den Bindungen zeigt, aktualisiert, sobald die Ziel Eigenschaft geändert wird PropertyChanged.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. Wenn der UpdateSourceTrigger Wert jedoch ist LostFocus, wird dieser Wert nur mit dem neuen Wert aktualisiert, wenn die Ziel Eigenschaft 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 bei Mode der-Eigenschaft haben verschiedene Abhängigkeits Eigenschaften UpdateSourceTrigger unterschiedliche Standardwerte.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 Quell Aktualisierungen in der Regel auftreten, wenn sich die Ziel Eigenschaft ändert CheckBox, was für es und andere einfache Steuerelemente in Ordnung ist.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. Daher hat die- Text Eigenschaft den Standard LostFocus Wert anstelle von PropertyChanged.That is why the Text property has a default value of LostFocus instead of PropertyChanged.

Informationen dazu UpdateSourceTrigger , wie Sie den Standard UpdateSourceTrigger Wert einer Abhängigkeits Eigenschaft suchen, finden Sie auf der Eigenschaften Seite.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 jeden UpdateSourceTrigger Wert, der TextBox als Beispiel verwendet wird: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 , der Validierungs Logik zugeordnet ist (siehe Abschnitt zur Datenvalidierung).A TextBox that is associated with validation logic (see Data Validation section)
PropertyChangedPropertyChanged Beim eingeben in dasTextBoxAs you type into the TextBox TextBoxSteuerelemente in einem Chatraum FensterTextBox controls in a chat room window
ExplicitExplicit Wenn die Anwendung aufruftUpdateSourceWhen the application calls UpdateSource TextBoxSteuerelemente in einem bearbeitbaren Formular (aktualisiert die Quell Werte nur, wenn der Benutzer auf die Schaltfläche "Senden" klickt)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

Zum erneuten erfassen einiger der in den vorherigen Abschnitten erläuterten Konzepte richten Sie mithilfe des Binding -Objekts eine Bindung ein, und jede Bindung hat normalerweise vier Komponenten: Bindungs Ziel, Ziel Eigenschaft, Bindungs Quelle und einen Pfad zum zu verwendenden 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- OneWay Eigenschaft die Bindung standardmäßig unterstützt.This is a OneWay binding because the Background property supports OneWay binding by default.

Diagramm, das die Eigenschaft für die Daten Bindungs Hintergrund anzeigt.

Sie Fragen sich vielleicht, warum dies funktioniert, auch wenn die ColorName -Eigenschaft vom Background Typ "String" Brushist, während die-Eigenschaft vom Typ ist.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 Bindungs Quelle durch Festlegen der DataContext -Eigenschaft für das DockPanel -Element angegeben wird.Notice that in the previous example, the binding source is specified by setting the DataContext property on the DockPanel element. Der Button erbt dann den DataContext Wert aus der DockPanel, die sein übergeordnetes 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. Die Verwendung DataContext der-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. Im vorherigen Beispiel können Sie anstelle der DataContext -Eigenschaft die Bindungs Quelle angeben, indem Sie die Source -Eigenschaft direkt auf die Bindungs Deklaration der Schaltfläche festlegen, 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>

Abgesehen von der direkten DataContext Festlegung der-Eigenschaft für ein Element, DataContext das den Wert von einem Vorgänger (z. b. die Schaltfläche im ersten Beispiel) erbt, und das explizite Source angeben der Bindungs Quelle durch Festlegen der-Eigenschaft auf der Binding (z. b. die Schaltfläche im letzten Beispiel), können Sie ElementName auch die- RelativeSource Eigenschaft oder die-Eigenschaft verwenden, um die Bindungs Quelle anzugeben.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 der Anwendung binden, z. b. Wenn Sie einen Schieberegler zum Anpassen der Breite einer Schaltfläche verwenden.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 einem ControlTemplate oder einem Styleangegeben wird.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 Bindungs Quelle ein Objekt ist, verwenden Sie die Path -Eigenschaft, um den Wert anzugeben, der für die Bindung verwendet werden soll.If your binding source is an object, you use the Path property to specify the value to use for your binding. Wenn Sie Daten an XMLXML Daten binden, verwenden Sie die XPath -Eigenschaft, um den Wert anzugeben.If you are binding to XMLXML data, you use the XPath property to specify the value. In einigen Fällen kann es auch dann auf die Verwendung der Path -Eigenschaft angewendet werden, wenn XMLXMLes sich um die Daten handelt.In some cases, it may be applicable to use the Path property even when your data is XMLXML. Wenn Sie z. b. auf die Name-Eigenschaft eines zurückgegebenen XmlNode (als Ergebnis einer XPath-Abfrage) zugreifen möchten, sollten Sie die Path -Eigenschaft zusätzlich XPath zur-Eigenschaft verwenden.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.

Syntax Informationen und Beispiele finden Sie auf den Path Eigenschaften XPath Seiten und.For syntax information and examples, see the Path and XPath property pages.

Beachten Sie, dass der Path zu verwendende Wert zwar eine der vier erforderlichen Komponenten einer Bindung ist, aber in den Szenarien, die Sie an ein gesamtes Objekt binden möchten, der zu verwendende Wert mit dem Bindungs Quell Objekt identisch ist.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 zutreffend, keine anzugeben 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 ListBox erbt der DataContext von einem übergeordneten DockPanel-Element (in diesem Beispiel nicht 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. Anders ausgedrückt: in diesem Beispiel wurde der Pfad ausgelassen, da die ItemsSource -Eigenschaft an das gesamte Objekt gebunden wird.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 Einstieg in andere Features und Verwendungszwecke der Datenbindung wäre es sinnvoll, die BindingExpression Klasse einzuführen.Before getting into other features and usages of data binding, it would be useful to introduce the BindingExpression class. Wie in den vorherigen Abschnitten gezeigt, ist die Binding -Klasse die Klasse auf hoher Ebene für die Deklaration einer Bindung. die Binding -Klasse stellt viele Eigenschaften bereit, mit denen Sie die Eigenschaften einer Bindung angeben können.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 dem Ziel beibehä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 Instanzausdruck, Bindingder nicht freigegeben werden kann und alle Instanzinformationen von enthält.A BindingExpression is an instance expression that cannot be shared and contains all the instance information of the Binding.

Beachten Sie z. b. Folgendes: myDataObject ist eine Instanz der MyData -Klasse, myBinding ist das Binding Quell Objekt, und die MyData -Klasse ist eine definierte Klasse, die eine Zeichen folgen Eigenschaft namens 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 wird der Text Inhalt von MyText, einer Instanz TextBlockvon, an MyDataPropertygebunden.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 gibt es zwei Instanzen BindingExpression , die das myBinding -Objekt gemeinsam nutzen.In that scenario, there will be two instances of BindingExpression sharing the myBinding object.

Ein BindingExpression -Objekt kann über den Rückgabewert von abgerufen werden GetBindingExpression , wenn für ein Daten gebundenes Objekt aufgerufen wird.A BindingExpression object can be obtained through the return value of calling GetBindingExpression on a data-bound object. Die folgenden Themen veranschaulichen einige Verwendungsmöglichkeiten 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, weil Background die zugehörige Eigenschaft an eine Zeichen folgen Eigenschaft 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 für den Brush Typ vorhanden ist, um den Zeichen folgen Wert in einen Brushzu konvertieren.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:

Diagramm, das die Standard Eigenschaft für die Datenbindung anzeigt.

Wenn Sie jedoch nicht über eine Eigenschaft vom Typ "String" verfügen, hat das Bindungs Quell Objekt eine Color - ColorEigenschaft vom Typ?However, what if instead of having a property of type string your binding source object has a Color property of type Color? Damit die Bindung funktioniert, müssen Sie in diesem Fall zuerst den Wert der Color -Eigenschaft in einen Wert umwandeln, den 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, indem Sie die IValueConverter -Schnittstelle implementieren, 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

Auf IValueConverter der Seite "Referenz" 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:

Diagramm, das den benutzerdefinierten Konverter der Datenbindung 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 wir noch nicht erörtert MultiBinding, wobei eine Ziel Eigenschaft über eine Auflistung von Bindungen verfügt.So far we have not yet discussed MultiBinding, where a target property has a collection of bindings. Im Fall MultiBindingeines verwenden Sie einen benutzerdefinierten IMultiValueConverter , um einen endgültigen Wert aus den Werten der Bindungen zu erhalten.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. Beispiele und MultiBinding Informationen finden Sie auf der Seite "Klasse".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. Ein häufiges Szenario ist Beispiels ItemsControl Weise die Verwendung ListBoxeiner, ListView, oder TreeView zum Anzeigen einer Datensammlung, z. b. in der im Abschnitt Was ist Datenbindung? gezeigten Anwendung.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 ein ItemsControl an eine Sammlung binden, sieht das Diagramm wie folgt aus:If you are binding an ItemsControl to a collection, the diagram looks like this:

Diagramm, das das ItemsControl-Objekt der Datenbindung anzeigt.

Wie in diesem Diagramm gezeigt, ist die Eigenschaft ItemsControl die Eigenschaft, die verwendet ItemsSource werden soll, um ein an ein Auflistungs Objekt zu binden.As shown in this diagram, to bind an ItemsControl to a collection object, ItemsSource property is the property to use. Sie können sich die ItemsSource -Eigenschaft als Inhalt ItemsControlvon vorstellen.You can think of ItemsSource property as the content of the ItemsControl. Beachten Sie, dass die OneWay Bindung ist ItemsSource , da OneWay die-Eigenschaft die Bindung standardmäßig unterstützt.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 auflisten, die die IEnumerable -Schnittstelle implementiert.You can enumerate over any collection that implements the IEnumerable interface. Wenn Sie jedoch dynamische Bindungen einrichten möchten, damit die UIUI Einfügungen oder Löschungen in der Auflistung automatisch aktualisieren, muss die-Auflistung die INotifyCollectionChanged -Schnittstelle implementieren.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.

WPFWPFstellt die ObservableCollection<T> -Klasse bereit, bei der es sich um eine integrierte Implementierung einer Datensammlung handelt INotifyCollectionChanged , die die-Schnittstelle verfügbar macht.provides the ObservableCollection<T> class, which is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. Beachten Sie, dass jedes Objekt in der Auflistung, das bindbare Eigenschaften unterstützt, auch die-Schnittstelle implementieren muss, um die INotifyPropertyChanged Übertragung von Datenwerten von Quell Objekten an Ziele vollständig zuNote 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 haben und eine eigene Auflistung implementieren möchten, sollten Sie ggf. verwenden IList, das eine nicht generische Auflistung von Objekten bereitstellt, auf die einzeln über einen Index zugegriffen werden kann, und somit die beste Leistung.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

Wenn Ihr ItemsControl an eine Datensammlung gebunden ist, können Sie die Daten sortieren, Filtern oder gruppieren.Once your ItemsControl is bound to a data collection, you may want to sort, filter, or group the data. Zu diesem Zweck verwenden Sie Auflistungs Sichten, bei denen es sich um ICollectionView Klassen handelt, die die Schnittstelle implementieren.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 Quell Auflistung die INotifyCollectionChanged -Schnittstelle implementiert, werden die Änderungen, die CollectionChanged vom-Ereignis ausgelöst werden, an die Sichten weitergegeben.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 wird so implementiert, dass ListBox die an eine Ansicht über die Datensammlung anstatt direkt an die Daten Auflistung bindet.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 Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) der Proxy einer Klasse, die von CollectionViewerbt.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 speziellen Beispiel ist der Source der Ansicht an die Auflistung der Auktions Elemente (vom Typ ObservableCollection<T>) des aktuellen Anwendungs Objekts gebunden.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 Bindungs Quelle für Elemente in der Anwendung, z ListBox. b.: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 weitere Ansicht für dieselbe Auflistung zu erstellen, können Sie eine CollectionViewSource andere-Instanz erstellen und Ihr x:Key einen anderen Namen zuordnen.To create another view for the same collection, you can create another CollectionViewSource instance and give it a different x:Key name.

In der folgenden Tabelle wird gezeigt, welche Sicht Datentypen als Standard Auflistungs CollectionViewSource Ansicht erstellt werden, oder basierend auf dem Quell Sammlungstyp.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, der auf basiert.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.

Um die Standardansicht zu erhalten, verwenden Sie GetDefaultView die-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

Um die Leistung zu verbessern, delegieren DataTable Auflistungs Ansichten für ADO.net oder DataView Objekte DataViewdas Sortieren und Filtern an den.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. Damit jede Auflistungs Ansicht unabhängig sortiert und gefiltert werden kann, initialisieren Sie jede Sammlungsansicht DataView mit Ihrem eigenen-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 Sortier Logik von "Sort by category and date" CheckBox der Anwendung UIUI im Abschnitt Was ist Datenbindung? :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 CheckBox enthält die Anwendung im Abschnitt Was ist Datenbindung? die Logik zum Herausfiltern von Elementen, die $25 oder Mehrkosten.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 Filter Ereignishandler festzulegen, CheckBox wenn dieser ausgewählt wird: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 CollectionView -Klassen direkt anstelle von CollectionViewSourceverwenden, verwenden Sie die Filter -Eigenschaft, um einen Rückruf anzugeben.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, in der IEnumerable eine Auflistung angezeigt wird, unterstützen alle Auflistungs Ansichten die Funktionalität der Gruppierung, die es dem Benutzer ermöglicht, die Auflistung in der Auflistungs Ansicht in logische Gruppen zu partitionieren.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 Kategorie "Gruppieren nach" 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 ListBox bestimmt die Auswahl in den Inhalt, der in der ContentControlangezeigt wird.In that application, the selection within the ListBox determines the content shown in the ContentControl. Wenn ein Element ausgewählt wird, werden die Details ListBox des ausgewählten Elements ContentControl angezeigt, wenn ein Element ausgewählt wird.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. Das folgende Beispiel aus der Daten Bindungs Demo zeigt das Markup ListBox von und die, ContentControl die Sie im Abschnitt Was ist Datenbindung? für die Anwendung UIUI sehen: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, denn wenn ein Singleton-Objekt ContentControl (in diesem Fall) an eine Auflistungs Ansicht gebunden ist, bindet es CurrentItem automatisch an die 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 CollectionViewSource , dass-Objekte die Währung und die Auswahl automatisch synchronisieren.Note that CollectionViewSource objects automatically synchronize currency and selection. Wenn das Listen Steuerelement nicht wie in diesem CollectionViewSource Beispiel an ein-Objekt gebunden ist, müssen Sie seine IsSynchronizedWithCurrentItem -Eigenschaft auf true festlegen, 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. Tatsächlich werden die Daten nicht wie gewünscht angezeigt, ohne dass Vorlagen verwendet werden (der explizit von ContentControl verwendete und der implizit ListBoxvon verwendete).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, werden sowohl das ListBox -Steuerelement als auch das ContentControl -Objekt an das gesamte Auflistungs Objekt (oder genauer gesagt die Ansicht über das Auflistungs Objekt) von " AuctionItems" gebunden.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 spezifische Anweisungen zum Anzeigen der Datensammlung zeigt das ListBox eine Zeichen folgen Darstellung der einzelnen Objekte in der zugrunde liegenden Auflistung an ContentControl und zeigt eine Zeichen folgen Darstellung des Objekts an, an 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, definiert DataTemplatedie Anwendung s.To solve that problem, the application defines DataTemplates. Wie im Beispiel im vorherigen Abschnitt gezeigt, ContentControl verwendet explizit das detailsProductListingTemplateDataTemplate-Objekt.As shown in the example in the previous section, the ContentControl explicitly uses the detailsProductListingTemplateDataTemplate. Das ListBox -Steuerelement verwendet beim DataTemplate Anzeigen der Auktions Element -Objekte in der-Auflistung implizit Folgendes: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>

Durch die Verwendung dieser beiden DataTemplates wird die resultierende Benutzeroberfläche im Abschnitt Was ist Datenbindung? angezeigt.With the use of those two DataTemplates, the resulting UI is the one shown in the What Is Data Binding? section. Wie Sie in diesem Screenshot sehen können, können Sie mit s nicht nur Daten in Ihren Steuerelementen DataTemplateplatzieren, sondern auch überzeugende Visualisierungen für Ihre Daten 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. Beispielsweise werden DataTriggerim obigen DataTemplate Beispiel s verwendet, sodass der Wert von " AuctionItems" mit dem SpecialFeatures -Wert " Hervorhebung " mit einem orangefarbenen Rahmen und einem Stern angezeigt wird.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

Das WPFWPF Daten Bindungs Modell ermöglicht es Ihnen, ValidationRules dem- Binding Objekt zuzuordnen.The WPFWPF data binding model allows you to associate ValidationRules with your Binding object. Im folgenden TextBox Beispiel wird ein-Objekt an eine Eigenschaft mit dem Namen StartPrice gebunden und ExceptionValidationRule der Binding.ValidationRules -Eigenschaft ein-Objekt hinzugefügt.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. WPFWPFverfügt über die folgenden beiden Typen von integrierten ValidationRule Objekten:has the following two types of built-in ValidationRule objects:

Sie können auch eine eigene Validierungs Regel erstellen, indem Sie von ValidationRule der-Klasse ableiten Validate und die-Methode implementieren.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, die im Abschnitt Was ist Datenbindung? zum TextBox Hinzufügen der Produkt Auflistung "Start Datum" verwendet wird:The following example shows the rule used by the Add Product Listing "Start Date" TextBox from the What Is Data Binding? section:

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

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

        Dim DateVal As DateTime

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

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

StartDateEntryForm TextBox verwendet dieses 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 UpdateSourceTrigger die Bindungs PropertyChanged-Engine den Quellwert bei jedem Tastatur Strich aktualisiert, da der Wert ist, was bedeutet, dass jede Regel ValidationRules in der Auflistung auf jedem Tastatur Strich überprüft wird.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 eines solchen Feedbacks besteht Validation.ErrorTemplate darin, die angefügte ControlTemplate-Eigenschaft auf eine benutzerdefinierte festzulegenOne way to provide such feedback is to set the Validation.ErrorTemplate attached property to a custom ControlTemplate. Wie im vorherigen unter Abschnitt gezeigt, verwendet StartDateEntryForm TextBox einen ErrorTemplate mit dem Namen " 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>

Das AdornedElementPlaceholder -Element gibt an, wo das zu erstellende Steuerelement platziert werden soll.The AdornedElementPlaceholder element specifies where the control being adorned should be placed.

Zusätzlich können Sie auch einen ToolTip verwenden, um die Fehlermeldung anzuzeigen.In addition, you may also use a ToolTip to display the error message. Sowohl StartDateEntryForm als auch startpreientryformTextBoxverwenden das ToolTip textStyleTextBox-Format, das eine erstellt, die die Fehlermeldung anzeigt.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 HasError - true Eigenschaft ist, wenn eine oder mehrere 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>

Beim benutzerdefinierten ErrorTemplate ToolTipund dem sieht StartDateEntryForm TextBox bei einem Validierungs Fehler wie folgt aus: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 Sie ErrorTemplate über zugeordnete Validierungsregeln verfügen, aber keinen für das gebundene Steuerelement angeben, wird ErrorTemplate ein Standardwert verwendet, um Benutzer zu benachrichtigen, wenn ein Validierungs Fehler vorliegt. BindingIf 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 Standard ErrorTemplate Wert ist eine Steuerelement Vorlage, 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 dem Standard ErrorTemplate -und ToolTipdem UIUI -Wert sieht startpreientryform TextBox bei einem Validierungs Fehler wie folgt aus: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. Dies tritt bei TwoWay - OneWayToSource und-Bindungen auf.This occurs on TwoWay and OneWayToSource bindings. Um dies zu wiederholen, hängt das Quell Update von dem Wert der UpdateSourceTrigger -Eigenschaft ab, wie im Abschnitt was löst Quell Updates beschrieben wird.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- ValidationRule Engine überprüft Binding, ob benutzerdefinierte-Objekte definiert ValidationStep sind, deren RawProposedValue auf festgelegt ist. in diesem Fall wird Validate die-Methode ValidationRule für jedes-Objekt aufgerufen, bis eines von Ihnen in einen Fehler auftritt. oder bis alle diese bestanden haben.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, überprüft die Bindungs-Engine, ob Benutzer ValidationRule definierte-Objekte ValidationStep definiert sind Binding, ConvertedProposedValue deren auf festgelegt ist. in diesem Fall Validate wird die- ValidationRule Methode für jedes-Objekt aufgerufen, das Legen Sie ConvertedProposedValue auf fest, bis eines von Ihnen in einen Fehler oder bis zu allen Läufen ausgeführt wird. ValidationStepIf 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 ValidationRule Bindungs-Engine überprüft Binding, ob benutzerdefinierte-Objekte definiert ValidationStep sind, deren UpdatedValue auf festgelegt ist. ValidationStep in diesem Fall wird Validate die-Methode ValidationRule für jeden aufgerufen, der auf festgelegt ist. UpdatedValue , bis einer von Ihnen in einen Fehler auftritt oder bis alle davon bestanden werden.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 einer Bindung zugeordnet ist und deren ValidationStep auf den Standard UpdatedValueWert festgelegt ist, wird DataErrorValidationRule der an dieser Stelle geprüft.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 Zeitpunkt, an dem Bindungen aktiviert ValidatesOnDataErrors werden, true für die auf festgelegt ist.This is also the point when bindings that have the ValidatesOnDataErrors set to true are checked.

  6. Die ValidationRule Bindungs-Engine überprüft Binding, ob benutzerdefinierte-Objekte definiert ValidationStep sind, deren CommittedValue auf festgelegt ist. ValidationStep in diesem Fall wird Validate die-Methode ValidationRule für jeden aufgerufen, der auf festgelegt ist. CommittedValue , bis einer von Ihnen in einen Fehler auftritt oder bis alle davon bestanden werden.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 während des gesamten Vorgangs nicht übergeben wird, erstellt die Bindungs-Engine ein ValidationError -Objekt und fügt es der Errors -Auflistung des gebundenen Elements hinzu.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 die Bindungs-Engine die ValidationRule Objekte in einem beliebigen Schritt ausführt, werden alle ValidationError Elemente entfernt, die während Errors dieses Schritts der angefügten-Eigenschaft des gebundenen Elements hinzugefügt wurden.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. Wenn z. b. ValidationRule ein ValidationStep auf UpdatedValue Fehler festgelegt ist, entfernt die Bindungs-Engine beim nächsten Auftreten des Überprüfungs Vorgangs ValidationStep diese ValidationError sofort, bevor Sie einen ValidationRule aufruft, der auf festgelegt ist. 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 nicht leer ist, wird HasError die angefügte-Eigenschaft des-Elements trueauf festgelegt.When Errors is not empty, the HasError attached property of the element is set to true. Auch wenn die NotifyOnValidationError -Eigenschaft Binding von auf truefestgelegt ist, löst die Bindungs-Engine das Validation.Error angefügte-Ereignis für das-Element aus.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 außerdem, dass die Errors angefügte Eigenschaft durch eine gültige Wertübertragung in beide Richtungen (Ziel an Quelle oder Ziel Quelle) gelöscht wird.Also note that a valid value transfer in either direction (target to source or source to target) clears the Errors attached property.

Wenn der Bindung entweder ExceptionValidationRule ein zugeordnet ist oder die ValidatesOnExceptions -Eigenschaft auf true festgelegt ist und eine Ausnahme ausgelöst wird, wenn die Bindungs-Engine die Quelle festlegt, prüft die Bindungs-Engine, ob eine UpdateSourceExceptionFiltervorhanden ist.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, den Rückruf UpdateSourceExceptionFilter zum Bereitstellen eines benutzerdefinierten Handlers für die Behandlung von Ausnahmen zu verwenden.You have the option to use the UpdateSourceExceptionFilter callback to provide a custom handler for handling exceptions. Wenn ein UpdateSourceExceptionFilter Bindingnicht in angegeben ist, erstellt die Bindungs-Engine eine ValidationError mit der-Ausnahme und fügt Sie der Errors -Auflistung des gebundenen Elements hinzu.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- TraceLevel Eigenschaft für ein Bindungs bezogenes Objekt so festlegen, dass Informationen über den Status einer bestimmten Bindung empfangen werden.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