Übersicht über Bindungsquellen
Bei der Datenbindung verweist das Bindungsquellenobjekt auf das Objekt, von dem Sie Daten abrufen. In diesem Thema werden die Objekttypen vorgestellt, die als Bindungsquelle verwendet werden können.
Dieses Thema enthält folgende Abschnitte.
- Typen von Bindungsquellen
- Implementieren einer Klasse als Bindungsquelle
- Verwenden von ganzen Objekten als Bindungsquelle
- Verwenden von Auflistungsobjekten als Bindungsquelle
- Berechtigungsanforderungen bei der Datenbindung
- Verwandte Abschnitte
Typen von Bindungsquellen
Bei der Datenbindung in Windows Presentation Foundation (WPF) werden die folgenden Typen von Bindungsquelle unterstützt:
Bindungsquelle |
Beschreibung |
---|---|
common language runtime (CLR)-Objekte |
Sie können eine Bindung an die öffentlichen Eigenschaften, Untereigenschaften und Indexer aller common language runtime (CLR)-Objekte herstellen. Das Bindungsmodul verwendet die CLR-Reflektion, um die Werte der Eigenschaften abzurufen. Darüber hinaus kann das Bindungsmodul auch bei Objekten, die ICustomTypeDescriptor implementieren oder über einen registrierten TypeDescriptionProvider verfügen, verwendet werden. 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 herstellen, das die IDynamicMetaObjectProvider-Schnittstelle implementiert. Wenn Sie auf den Member im Code zugreifen können, kann daran gebunden werden. Wenn Sie z. B. mithilfe eines dynamischen Objekts auf einen Member im Code über someObjet.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 wie DataTable herstellen. ADO.NET DataView implementiert die IBindingList-Schnittstelle, die Änderungsbenachrichtigungen bereitstellt, auf die das Bindungsmodul lauscht. |
XML-Objekte |
Sie können eine Bindung an XmlNode, XmlDocument oder XmlElement herstellen und für diese Objekte auch XPath-Abfragen ausführen. Auf XML-Daten, bei denen es sich um die Bindungsquelle im Markup handelt, kann auf einfache Weise mit einem XmlDataProvider-Objekt zugegriffen werden. Weitere Informationen finden Sie unter Gewusst wie: Binden an XML-Daten mithilfe von XMLDataProvider und XPath-Abfragen. Sie können auch eine Bindung an XElement oder XDocument oder an Abfrageergebnisse auf Objekten dieser Typen mithilfe von LINQ to XML herstellen. 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 Gewusst wie: Binden an XDocument, XElement oder LINQ für XML-Abfrageergebnisse. |
DependencyObject-Objekte |
Sie können mit den Abhängigkeitseigenschaften von DependencyObject eine Bindung herstellen. Ein Beispiel finden Sie unter Gewusst wie: 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 können.
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. Empfohlen wird hierbei, dass die CLR-Klasse oder die dynamische Klasse die INotifyPropertyChanged-Schnittstelle implementiert. Weitere Informationen finden Sie unter Gewusst wie: 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, für die Änderungsbenachrichtigungen ausgegeben werden sollen, unterstützen. 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 mit XAML erstellen möchten, muss die Klasse über einen Standardkonstruktor verfügen. In einigen .NET-Sprachen wie C# wird der Standardkonstruktor eventuell automatisch erstellt.
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 hergestellt werden.
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 ganzen Objekten als Bindungsquelle
Sie können das gesamte Objekt als Bindungsquelle verwenden. Sie können eine Bindungsquelle mit den Eigenschaften Source oder DataContext angeben und dann eine leere Bindungsdeklaration bereitstellen: {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 Gewusst wie: 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 zum Beispiel um einen benutzerspezifischen Konverter (falls keine Standardkonvertierung vorhanden ist) oder um DataTemplate handeln. Weitere Informationen zu Konvertern finden Sie im Abschnitt zur Datenkonvertierung unter Übersicht über Datenbindung. Weitere Informationen zu Datenvorlagen finden Sie unter Ü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 UI 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>-Klasse ist eine integrierte Implementierung einer Datensammlung, 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 Gewusst wie: Erstellen und Binden an ObservableCollection. Statt eigene Auflistungen zu implementieren, können Sie auch ObservableCollection<T> bzw. eine vorhandene Auflistungsklasse wie List<T>, Collection<T> oder BindingList<T> verwenden.
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 über Standardansichten finden Sie unter Übersicht über 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:
Eigenschaftentyp (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 |
Nein |
Ja |
Nein |
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 das Bindungsmodul mittels Reflektion auf die Bindungsquelleigenschaft zugreifen kann. Andernfalls wird vom Bindungsmodul 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 Kompilierzeit 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) (Visual Basic).
Weitere Informationen zur Sicherheit bei teilweiser Vertrauenswürdigkeit finden Sie unter WPF-Sicherheit mit teilweiser Vertrauenswürdigkeit.
Siehe auch
Aufgaben
Gewusst wie: Angeben der Bindungsquelle
Referenz
Konzepte
Übersicht über die WPF-Datenbindung mit LINQ to XML
Optimieren der Leistung: Datenbindung