Übersicht über Bindungsquellen
Bei der Datenbindung verweist das Bindungsquellenobjekt auf das Objekt, aus dem Sie Daten abrufen. In diesem Thema werden die Objekttypen vorgestellt, die als Bindungsquelle verwendet werden können.
Typen von Bindungsquellen
Windows Presentation Foundation -Datenbindung (WPF) unterstützt die folgenden Bindungsquellentypen:
Bindungsquelle | BESCHREIBUNG |
---|---|
CLR-Objekte (Common Language Runtime) | Sie können eine Bindung an die öffentlichen Eigenschaften, Untereigenschaften und Indexer aller CLR-Objekte herstellen. Die Bindungs-Engine verwendet CLR-Reflektion, um die Werte der Eigenschaften zu erhalten. Alternativ dazu funktionieren Objekte, die eine ICustomTypeDescriptor implementieren oder eine registrierte TypeDescriptionProvider haben, auch mit der Bindungsengine. Weitere Informationen zum Implementieren einer Klasse, die als Bindungsquelle dienen kann, finden Sie weiter unten in diesem Thema unter Implementieren einer Klasse als Bindungsquelle. |
Dynamische Objekte | Sie können eine Bindung an verfügbare Eigenschaften und Indexer eines Objekts erstellen, das die IDynamicMetaObjectProvider-Schnittstelle implementiert. Wenn Sie auf den Member im Code zugreifen können, kann daran eine Bindung erfolgen. Wenn Sie z. B. mithilfe eines dynamischen Objekts auf einen Member im Code über someObject.AProperty zugreifen können, können Sie durch Festlegen des Bindungspfads auf AProperty eine Bindung herstellen. |
ADO.NET-Objekte | Sie können eine Bindung an ADO.NET-Objekte erstellen (beispielsweise DataTable). Die ADO.NET-Datenansicht (DataView) implementiert die IBindingList-Schnittstelle, die Änderungsbenachrichtigungen liefert, auf die die Bindungs-Engine lauscht. |
XML-Objekte | Sie können eine Bindung an XPath -Abfragen erstellen und entsprechende Abfragen für XmlNode, XmlDocument, oder XmlElement ausführen. Ein bequemer Weg, um auf XML-Daten zuzugreifen, die die verbindliche Quelle im Markup sind, ist die Verwendung eines XmlDataProvider-Objekts. Weitere Informationen finden Sie unter Binden an XML-Daten mithilfe von XMLDataProvider und XPath-Abfragen.Sie können auch eine Bindung an XElement oder XDocument oder eine Bindung an die Ergebnisse von Abfragen erstellen, die für Objekte dieser Typen ausgeführt werden, indem Sie LINQ to XML. Auf XML-Daten, bei denen es sich um die Bindungsquelle im Markup handelt, kann mithilfe von LINQ to XML auf einfache Weise über ein ObjectDataProvider-Objekt zugegriffen werden. Weitere Informationen finden Sie unter Binden an XDocument, XElement oder LINQ für XML-Abfrageergebnisse. |
DependencyObject-Objekte | Eine Bindung an Abhängigkeitseigenschaften einer DependencyObject ist immer möglich. Ein Beispiel finden Sie unter Binden der Eigenschaften von zwei Steuerelementen. |
Implementieren einer Klasse als Bindungsquelle
Sie können eigene Bindungsquellen erstellen. In diesem Abschnitt erfahren Sie, wie Sie eine Klasse als Bindungsquelle implementieren.
Bereitstellen von Änderungsbenachrichtigungen
Wenn Sie die OneWay-Bindung oder die TwoWay-Bindung verwenden (da die UI bei einer Änderung der Eigenschaften der Bindungsquelle dynamisch aktualisiert werden soll), müssen Sie einen geeigneten Mechanismus für die Änderungsbenachrichtigung implementieren. Der empfohlene Mechanismus ist, dass die CLR oder die dynamische Klasse die INotifyPropertyChanged-Schnittstelle implementiert. Weitere Informationen finden Sie unter Implementieren von Benachrichtigungen bei Eigenschaftenänderungen.
Beim Erstellen eines CLR-Objekts, das INotifyPropertyChanged nicht implementiert, müssen Sie Ihr eigenes Benachrichtigungssystem einrichten, um sicherzustellen, dass die in einer Bindung verwendeten Daten immer aktuell sind. Sie können Änderungsbenachrichtigungen bereitstellen, indem Sie das PropertyChanged
-Muster für jede Eigenschaft unterstützen, für die Änderungsbenachrichtigungen ausgegeben werden sollen. Um dieses Muster zu unterstützen, definieren Sie für jede Eigenschaft ein Name_der_EigenschaftChanged-Ereignis, wobei Name_der_Eigenschaft der Name der jeweiligen Eigenschaft ist. Dieses Ereignis wird bei jeder Änderung der Eigenschaft ausgelöst.
Wenn die Bindungsquelle einen dieser Benachrichtigungsmechanismen implementiert, erfolgt die Aktualisierung des Ziels automatisch. Falls die Bindungsquelle aus irgendeinem Grund keine ordnungsgemäße Benachrichtigung für Eigenschaftsänderungen bereitstellt, kann die Zieleigenschaft explizit mit der UpdateTarget-Methode aktualisiert werden.
Weitere Merkmale
In der folgenden Liste finden Sie weitere zu beachtende Punkte:
Wenn Sie das Objekt in XAML erstellen möchten, muss die Klasse über einen parameterlosen Konstruktor verfügen. In einigen .NET-Sprachen, wie z.B. C#, kann der parameterlose Konstruktor für Sie erstellt werden.
Die als Bindungsquelleigenschaften für eine Bindung verwendeten Eigenschaften müssen öffentliche Eigenschaften der Klasse sein. Explizit definierte Schnittstelleneigenschaften sowie geschützte, private, interne und virtuelle Eigenschaften können nicht für eine Bindung herangezogen werden.
An öffentliche Felder kann keine Bindung erfolgen.
Der in der Klasse deklarierte Eigenschaftentyp ist der an die Bindung übergebene Typ. Allerdings wird der letztendlich in der Bindung verwendete Typ durch die Eigenschaft des Bindungsziels und nicht durch die Bindungsquelleigenschaft bestimmt. Falls sich die Typen unterscheiden, können Sie ggf. einen Konverter erstellen, der vorgibt, wie die benutzerdefinierte Eigenschaft anfänglich an die Bindung übergeben wird. Weitere Informationen finden Sie unter IValueConverter.
Verwenden von gesamten Objekten als Bindungsquelle
Sie können das gesamte Objekt als Bindungsquelle verwenden. Sie können eine Bindungsquelle angeben, indem Sie die Source- oder die DataContext-Eigenschaft verwenden, und dann eine leere Bindungsdeklaration angeben: {Binding}
. Diese Vorgehensweise eignet sich zum Beispiel für Szenarien, bei denen die Bindung an „string“-Objekte, an Objekte mit mehreren relevanten Eigenschaften oder an Auflistungsobjekte erfolgt. Ein Beispiel für die Bindung an ein gesamtes Auflistungsobjekt finden Sie unter Verwenden des Master/Detail-Musters mit hierarchischen Daten.
Beachten Sie, dass Sie ggf. benutzerdefinierte Logik anwenden müssen, damit die Daten für die gebundene Zieleigenschaft sinnvoll sind. Bei der benutzerdefinierten Logik kann es sich z. B. um einen benutzerdefinierten Konverter oder DataTemplate handeln, falls keine Standardtypkonvertierung vorhanden ist. Weitere Informationen zu Konvertern finden Sie im Abschnitt „Datenkonvertierung“ in der Übersicht über die Datenbindung. Weitere Informationen zu Datenvorlagen finden Sie in der Übersicht über Datenvorlagen.
Verwenden von Auflistungsobjekten als Bindungsquelle
Häufig handelt es sich bei dem Objekt, das Sie verwenden möchten, um eine Auflistung benutzerdefinierter Objekte. Jedes Objekt fungiert als Quelle für eine Instanz einer wiederholten Bindung. So verfügen Sie vielleicht über eine CustomerOrders
-Auflistung mit CustomerOrder
-Objekten, die wiederholt von Ihrer Anwendung durchlaufen wird, um festzustellen, wie viele Bestellungen mit welchen Daten vorhanden sind.
Sie können jede Auflistung auflisten, die die IEnumerable-Schnittstelle implementiert. Um dynamische Bindungen einzurichten, bei denen die Benutzeroberfläche automatisch nach Einfügungen oder Löschungen in der Auflistung aktualisiert wird, muss die Auflistung die INotifyCollectionChanged-Schnittstelle implementieren. Diese Schnittstelle macht ein Ereignis verfügbar, das bei jeder Änderung der zugrunde liegenden Auflistung ausgelöst werden muss.
Die ObservableCollection<T> ist die integrierte Implementierung einer Datenauflistung, die die INotifyCollectionChanged-Schnittstelle verfügbar macht. Die einzelnen Datenobjekte in der Auflistung müssen die zuvor beschriebenen Anforderungen erfüllen. Ein Beispiel finden Sie unter Erstellen und Binden an ObservableCollection. 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.
WPF wird nie direkt an eine Auflistung gebunden. Wenn Sie eine Auflistung als Bindungsquelle angeben, wird WPF an die Standardansicht der Auflistung gebunden. Weitere Informationen zu Standardansichten finden Sie in der Übersicht über die Datenbindung.
Wenn Sie in einem erweiterten Szenario eine eigene Auflistung implementieren möchten, sollten Sie die Verwendung der IList-Schnittstelle in Erwägung ziehen. IList stellt eine nicht generische Auflistung von Objekten bereit, auf die einzeln nach Index zugegriffen werden kann. Dadurch kann die Leistung verbessert werden.
Berechtigungsanforderungen bei der Datenbindung
Bei der Datenbindung muss die Vertrauensebene der Anwendung beachtet werden. Die folgende Tabelle enthält eine Übersicht über die Eigenschaftstypen, mit denen in einer Anwendung, die mit voller oder teilweiser Vertrauenswürdigkeit ausgeführt wird, eine Bindung hergestellt werden kann:
Eigenschaftstyp (alle Zugriffsmodifizierer) |
Dynamische Objekteigenschaft | Dynamische Objekteigenschaft | CLR-Eigenschaft | CLR-Eigenschaft | Abhängigkeitseigenschaft | Abhängigkeitseigenschaft |
---|---|---|---|---|---|---|
Vertrauensebene | Volle Vertrauenswürdigkeit | Teilweise Vertrauenswürdigkeit | Volle Vertrauenswürdigkeit | Teilweise Vertrauenswürdigkeit | Volle Vertrauenswürdigkeit | Teilweise Vertrauenswürdigkeit |
Öffentliche Klasse | Ja | Ja | Ja | Ja | Ja | Ja |
Nicht öffentliche Klasse | Ja | Keine | Ja | Keine | Ja | Ja |
In dieser Tabelle werden die folgenden wichtigen Punkte bezüglich der bei der Datenbindung erforderlichen Berechtigungen beschrieben:
Bei CLR-Eigenschaften funktioniert die Datenbindung, solange die Bindungs-Engine mittels Reflektion auf die Bindungsquelleigenschaft zugreifen kann. Andernfalls wird von der Bindungs-Engine eine Warnung ausgegeben, dass die Eigenschaft nicht gefunden wurde. In diesem Fall wird der Fallbackwert bzw. der Standardwert (sofern verfügbar) verwendet.
Sie können eine Bindung an Eigenschaften für dynamische Objekte herstellen, die zur Kompilier- oder Laufzeit definiert werden.
Eine Bindung an Abhängigkeitseigenschaften ist immer möglich.
Die erforderlichen Berechtigungen für XML-Bindungen sind ähnlich. In einer teilweise vertrauenswürdigen Sandbox kann XmlDataProvider nur ausgeführt werden, wenn die Berechtigung zum Zugriff auf die angegebenen Daten besteht.
Objekte mit einem anonymen Typ sind intern. Eine Bindung an Eigenschaften anonymer Typen kann nur bei der Ausführung mit voller Vertrauenswürdigkeit hergestellt werden. Weitere Informationen zu anonymen Typen finden Sie unter Anonyme Typen (C#-Programmierhandbuch) oder Anonyme Typen (Visual Basic).
Weitere Informationen zur Sicherheit bei teilweiser Vertrauenswürdigkeit finden Sie unter WPF-Sicherheit mit teilweiser Vertrauenswürdigkeit.
Weitere Informationen
.NET Desktop feedback