Übersicht über Bindungsquellen (WPF .NET)

Bei der Datenbindung verweist das Bindungsquellenobjekt auf das Objekt, aus dem Sie Daten abrufen. In diesem Artikel werden die Arten von Objekten erläutert, die als Bindungsquelle verwendet werden können. Hierzu zählen beispielsweise .NET CLR-Objekte, XML und DependencyObject-Objekte.

Arten von Bindungsquellen

WPF-Datenbindung (Windows Presentation Foundation) unterstützt die folgenden Arten von Bindungsquellen:

  • .NET 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-Reflexion, um die Werte der Eigenschaften zu erhalten. Objekte, die ICustomTypeDescriptor implementieren oder über einen registrierten Typbeschreibungsanbieter (TypeDescriptionProvider) verfügen, können ebenfalls mit der Bindungs-Engine verwendet werden.

    Weitere Informationen zum Implementieren einer Klasse, die als Bindungsquelle fungieren kann, finden Sie weiter unten in diesem Thema unter Implementieren einer Bindungsquelle für Ihre Objekte.

  • 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. Auf XML-Daten, bei denen es sich um die Bindungsquelle im Markup handelt, kann komfortabel über ein 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 eine Bindung an die Ergebnisse von Abfragen erstellen, die für Objekte dieser Typen ausgeführt werden, indem Sie LINQ to XML verwenden. 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 eine Bindung an Abhängigkeitseigenschaften eines beliebigen Abhängigkeitsobjekts (DependencyObject) erstellen. Ein Beispiel finden Sie unter Gewusst wie: Binden der Eigenschaften von zwei Steuerelementen.

Implementieren einer Bindungsquelle für Ihre Objekte

Ihre CLR-Objekte können zu Bindungsquellen werden. Es gibt einige Dinge, die beim Implementieren einer Klasse als Bindungsquelle beachtet werden müssen.

Bereitstellen von Änderungsbenachrichtigungen

Wenn Sie eine OneWay- oder TwoWay-Bindung verwenden, implementieren Sie einen geeigneten Benachrichtigungsmechanismus für geänderte Eigenschaften. Für die CLR und die dynamische Klasse wird die Implementierung der INotifyPropertyChanged-Schnittstelle empfohlen. Weitere Informationen finden Sie unter Gewusst wie: Implementieren von Benachrichtigungen bei Eigenschaftenänderungen.

Abonnenten können auf zwei Arten über Eigenschaftenänderungen informiert werden:

  1. Implementieren Sie die INotifyPropertyChanged-Schnittstelle.

    Dies ist der empfohlene Mechanismus für Benachrichtigungen. Die INotifyPropertyChanged-Schnittstelle stellt das PropertyChanged-Ereignis bereit, das vom Bindungssystem berücksichtigt wird. Durch Auslösen dieses Ereignisses und Bereitstellen des Namens der geänderten Eigenschaft wird ein Bindungsziel über die Änderung informiert.

  2. Implementieren des PropertyChanged-Musters

    Jede Eigenschaft, die ein Bindungsziel darüber informieren muss, dass sie geändert wurde, verfügt über ein entsprechendes PropertyNameChanged-Ereignis, wobei PropertyName der Name der 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äßen Benachrichtigungen für Eigenschaftenänderungen bereitstellt, kann die Zieleigenschaft explizit mithilfe der UpdateTarget-Methode aktualisiert werden.

Weitere Merkmale

In der folgenden Liste finden Sie weitere zu beachtende Punkte:

  • Datenobjekte, die als Bindungsquellen fungieren, können in XAML als Ressourcen deklariert werden, sofern sie über einen parameterlosen Konstruktor verfügen. Andernfalls müssen Sie das Datenobjekt im Code erstellen und direkt dem Datenkontext Ihrer XAML-Objektstruktur oder als Bindungsquelle der Bindung zuweisen.

  • Die als Bindungsquelleigenschaften verwendeten Eigenschaften müssen öffentliche Eigenschaften Ihrer Klasse sein. Explizit definierte Schnittstelleneigenschaften sowie geschützte, private, interne und virtuelle Eigenschaften können nicht für eine Bindung verwendet werden.

  • Eine Bindung an öffentliche Felder ist nicht möglich.

  • 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, um zu steuern, wie die benutzerdefinierte Eigenschaft anfänglich an die Bindung übergeben wird. Weitere Informationen finden Sie unter IValueConverter.

Gesamte Objekte als Bindungsquelle

Sie können das gesamte Objekt als Bindungsquelle verwenden. Geben Sie eine Bindungsquelle unter Verwendung der Eigenschaft Source oder DataContext und anschließend eine leere Bindungsdeklaration an: {Binding}. Diese Vorgehensweise eignet sich zum Beispiel für Szenarien, in denen die Bindung an Zeichenfolgenobjekte, 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.

Möglicherweise müssen Sie benutzerdefinierte Logik anwenden, damit die Daten für die gebundene Zieleigenschaft sinnvoll sind. Bei der benutzerdefinierten Logik kann es sich z. B. um einen benutzerdefinierten Konverter oder um eine Datenvorlage (DataTemplate) handeln. Weitere Informationen zu Konvertern finden Sie unter Datenkonvertierung. Weitere Informationen zu Datenvorlagen finden Sie in der Übersicht über Datenvorlagen.

Auflistungsobjekte 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 Gewusst wie: Erstellen und Binden an ObservableCollection. Erwägen Sie vor der Implementierung einer eigenen Auflistung die Verwendung von ObservableCollection<T> oder einer der vorhandenen Auflistungsklassen. Hierzu zählen unter anderem List<T>, Collection<T> und BindingList<T>.

Wenn Sie eine Auflistung als Bindungsquelle angeben, wird von WPF keine direkte Bindung die Auflistung erstellt. Vielmehr wird von WPF eine Bindung an die Standardansicht der Auflistung erstellt. Informationen zu Standardansichten finden Sie unter Verwenden einer Standardansicht.

Wenn Sie in einem erweiterten Szenario eine eigene Auflistung implementieren möchten, empfiehlt sich möglicherweise die Verwendung der IList-Schnittstelle. Diese Schnittstelle stellt eine nicht generische Auflistung von Objekten bereit, auf die einzeln nach Index zugegriffen werden kann, wodurch sich ggf. die Leistung verbessert.

Berechtigungsanforderungen bei der Datenbindung

Im Gegensatz zu .NET Framework wird .NET mit vollständig vertrauenswürdiger Sicherheit ausgeführt. Alle Datenbindung werden mit dem gleichen Zugriff ausgeführt, über den auch der Benutzer verfügt, der die Anwendung ausführt.

Weitere Informationen