Overzicht van bindingsbronnen
In gegevensbinding verwijst het bindingsbronobject naar het object waaruit u gegevens ophaalt. In dit onderwerp worden de typen objecten besproken die u als bindingsbron kunt gebruiken.
Bindingbrontypen
Windows Presentation Foundation-gegevensbinding (WPF) ondersteunt de volgende bindingsbrontypen:
Bindingsbron | Beschrijving |
---|---|
CLR-objecten (Common Language Runtime) | U kunt verbinding maken met openbare eigenschappen, subeigenschappen en indexeerfuncties van elk CLR-object (Common Language Runtime). De bindingsengine gebruikt CLR-reflectie om de waarden van de eigenschappen op te halen. U kunt daarentegen ook objecten die ICustomTypeDescriptor implementeren of een geregistreerde TypeDescriptionProvider hebben met de bindingsengine gebruiken. Zie Een klasse implementeren voor de bindingsbron verderop in dit onderwerp voor meer informatie over het implementeren van een klasse die als bindingsbron kan fungeren. |
dynamische objecten | U kunt verbinden met beschikbare eigenschappen en indexeerfuncties van een object dat de IDynamicMetaObjectProvider-interface implementeert. Als u toegang hebt tot het lid in code, kunt u er verbinding mee maken. Als u met een dynamisch object bijvoorbeeld via someObject.AProperty toegang hebt tot een lid in code, kunt u er verbinding mee maken door het bindingspad in te stellen op AProperty . |
ADO.NET-objecten | U kunt verbinding maken met ADO.NET objecten, zoals DataTable. De ADO.NET DataView implementeert de IBindingList-interface, die wijzigingsmeldingen biedt waarnaar de bindingsengine luistert. |
XML-objecten | U kunt query's van XPath binden en uitvoeren op een XmlNode, XmlDocumentof XmlElement. Een handige manier om toegang te krijgen tot XML-gegevens die de bindingsbron in markeringen zijn, is door een XmlDataProvider-object te gebruiken. Zie Binden aan XML-gegevens met behulp van een XMLDataProvider- en XPath-query'svoor meer informatie.U kunt ook verbinden met een XElement of XDocument, of verbinden met de resultaten van query's die worden uitgevoerd op objecten van deze typen met behulp van LINQ naar XML. Een handige manier om LINQ to XML te gebruiken voor toegang tot XML-gegevens die in markup de bindingsbron vormen, is door een ObjectDataProvider-object te gebruiken. Zie Binden aan XDocument, XElement of LINQ voor XML-queryresultatenvoor meer informatie. |
DependencyObject-objecten | U kunt verbinden met afhankelijkheidseigenschappen van elke DependencyObject. Zie voor een voorbeeld De eigenschappen van twee besturingselementen binden. |
Een klasse implementeren voor de bindingsbron
U kunt uw eigen bindingsbronnen maken. In deze sectie worden de dingen besproken die u moet weten als u een klasse implementeert om als bindingsbron te fungeren.
Het verstrekken van wijzigingsmeldingen
Als u OneWay of TwoWay binding gebruikt (omdat u wilt dat de gebruikersinterface wordt bijgewerkt wanneer de eigenschappen van de bindingsbron dynamisch worden gewijzigd), moet u een geschikt mechanisme voor gewijzigde eigenschappen implementeren. Het aanbevolen mechanisme is dat de CLR- of dynamische klasse de INotifyPropertyChanged-interface implementeert. Zie Melding voor eigenschapswijziging implementerenvoor meer informatie.
Als u een CLR-object maakt dat geen INotifyPropertyChangedimplementeert, moet u ervoor zorgen dat uw eigen meldingssysteem ervoor zorgt dat de gegevens die in een binding worden gebruikt, actueel blijven. U kunt wijzigingsmeldingen opgeven door het patroon PropertyChanged
te ondersteunen voor elke eigenschap waarvoor u meldingen wilt ontvangen. Ter ondersteuning van dit patroon definieert u een PropertyNameGewijzigde gebeurtenis voor elke eigenschap, waarbij PropertyName de naam van de eigenschap is. U verhoogt de gebeurtenis telkens wanneer de eigenschap wordt gewijzigd.
Als uw bindingsbron een van deze meldingsmechanismen implementeert, worden doelupdates automatisch uitgevoerd. Als uw bindingsbron om welke reden dan ook geen meldingen bevat over de juiste eigenschap die is gewijzigd, kunt u de methode UpdateTarget gebruiken om de doeleigenschap expliciet bij te werken.
Andere kenmerken
De volgende lijst bevat andere belangrijke punten die u moet noteren:
Als u het object in XAML wilt maken, moet de klasse een parameterloze constructor hebben. In sommige .NET-talen, zoals C#, kan de parameterloze constructor voor u worden gemaakt.
De eigenschappen die u als bindingbroneigenschappen voor een binding gebruikt, moeten openbare eigenschappen van uw klasse zijn. Expliciet gedefinieerde interface-eigenschappen kunnen niet worden geopend voor bindingsdoeleinden en kunnen ook geen beveiligde, privé-, interne of virtuele eigenschappen hebben die geen basis-implementatie hebben.
U kunt geen verbinding maken met openbare velden.
Het type van de eigenschap die in uw klasse is gedeclareerd, is het type dat wordt doorgegeven aan de binding. Het type dat uiteindelijk door de binding wordt gebruikt, is echter afhankelijk van het type bindingsdoeleigenschap, niet van de eigenschap bindingsbron. Als er een verschil in type is, kunt u een conversieprogramma schrijven om aan te geven hoe uw aangepaste eigenschap in eerste instantie wordt doorgegeven aan de binding. Zie IValueConvertervoor meer informatie.
Hele objecten gebruiken als bindingsbron
U kunt een heel object gebruiken als bindingsbron. U kunt een bindingsbron opgeven met behulp van de eigenschap Source of de eigenschap DataContext en vervolgens een lege bindingsdeclaratie opgeven: {Binding}
. Scenario's waarin dit handig is, zijn binding met objecten van het type tekenreeks, binding met objecten met meerdere eigenschappen waarin u geïnteresseerd bent, of binding met verzamelingsobjecten. Zie Het patroon Master-Detail gebruiken met hiërarchische gegevensvoor een voorbeeld van een binding met een volledig verzamelingsobject.
Mogelijk moet u aangepaste logica toepassen, zodat de gegevens zinvol zijn voor uw afhankelijke doeleigenschap. De aangepaste logica kan de vorm hebben van een aangepast conversieprogramma (als er geen standaardtypeconversie bestaat) of een DataTemplate. Zie de sectie Gegevensconversie van Overzicht van gegevensbindingvoor meer informatie over conversieprogramma's. Zie Overzicht van gegevenssjablonen voor meer informatie over gegevenssjablonen.
Verzamelingsobjecten gebruiken als bindingsbron
Vaak is het object dat u wilt gebruiken als bindingsbron een verzameling aangepaste objecten. Elk object fungeert als de bron voor één exemplaar van een herhaalde binding. U hebt bijvoorbeeld een CustomerOrders
verzameling die bestaat uit CustomerOrder
objecten, waarbij uw toepassing de verzameling doorloopt om te bepalen hoeveel orders er bestaan en welke gegevens er zijn.
U kunt elke verzameling opsommen die de IEnumerable-interface implementeert. Als u echter dynamische bindingen wilt instellen zodat invoegingen of verwijderingen in de verzameling de gebruikersinterface automatisch bijwerken, moet de verzameling de INotifyCollectionChanged-interface implementeren. Deze interface maakt een gebeurtenis beschikbaar die moet worden gegenereerd wanneer de onderliggende verzameling wordt gewijzigd.
De ObservableCollection<T>-klasse is een ingebouwde implementatie van een gegevensverzameling die de INotifyCollectionChanged-interface beschikbaar maakt. De afzonderlijke gegevensobjecten binnen de verzameling moeten voldoen aan de vereisten die in de voorgaande secties worden beschreven. Zie voor een voorbeeld Creëren en binden aan een ObservableCollection. Voordat u uw eigen verzameling implementeert, kunt u overwegen om ObservableCollection<T> of een van de bestaande verzamelingsklassen te gebruiken, zoals List<T>, Collection<T>en BindingList<T>, onder andere.
WPF bindt nooit rechtstreeks aan een verzameling. Als u een verzameling opgeeft als een bindingsbron, wordt WPF daadwerkelijk gekoppeld aan de standaardweergave van de verzameling. Zie Overzicht van gegevensbindingvoor meer informatie over standaardweergaven.
Als u een geavanceerd scenario hebt en u uw eigen verzameling wilt implementeren, kunt u overwegen de IList-interface te gebruiken. IList biedt een niet-algemene verzameling objecten die afzonderlijk toegankelijk zijn voor indexen, waardoor de prestaties kunnen worden verbeterd.
Toestemmingsvereisten in gegevensbinding
Wanneer gegevensbinding is, moet u rekening houden met het vertrouwensniveau van de toepassing. In de volgende tabel ziet u een overzicht van de eigenschappentypen die kunnen worden gekoppeld aan een toepassing die wordt uitgevoerd in een volledige of gedeeltelijke vertrouwensrelatie:
Eigenschapstype (alle toegangsaanpassingen) |
Dynamische objecteigenschap | Dynamische objecteigenschap | CLR-eigenschap | CLR-eigenschap | Afhankelijkheidseigenschap | Afhankelijkheidseigenschap |
---|---|---|---|---|---|---|
vertrouwensniveau | volledig vertrouwen | gedeeltelijke vertrouwensrelatie | volledig vertrouwen | gedeeltelijke vertrouwensrelatie | volledig vertrouwen | gedeeltelijke vertrouwensrelatie |
Publieke klasse | Ja | Ja | Ja | Ja | Ja | Ja |
Niet-openbare klasse | Ja | Nee | Ja | Nee | Ja | Ja |
In deze tabel worden de volgende belangrijke punten beschreven over machtigingsvereisten in gegevensbinding:
Voor CLR-eigenschappen werkt gegevensbinding zolang de bindingsengine toegang heeft tot de eigenschap van de bindingsbron met behulp van reflectie. Anders geeft de bindingsengine een waarschuwing uit dat de eigenschap niet kan worden gevonden en de terugvalwaarde of de standaardwaarde wordt gebruikt, als deze beschikbaar is.
U kunt binden aan eigenschappen op dynamische objecten die tijdens het compileren of de uitvoeringstijd zijn gedefinieerd.
U kunt altijd binden aan afhankelijkheidseigenschappen.
De machtigingsvereiste voor XML-binding is vergelijkbaar. In een sandbox met gedeeltelijke vertrouwensrelaties mislukt XmlDataProvider wanneer deze geen machtigingen heeft voor toegang tot de opgegeven gegevens.
Objecten met een anoniem type zijn intern. U kunt alleen binden aan eigenschappen van anonieme typen als de applicatie in volledige vertrouwensmodus draait. Zie Anonieme typen (C#-programmeerhandleiding) of Anonieme typen (Visual Basic) (Visual Basic) voor meer informatie over anonieme typen.
Zie WPF Partial Trust Securityvoor meer informatie over de beveiliging van gedeeltelijke vertrouwensrelaties.
Zie ook
.NET Desktop feedback