Che cosa sono le origini di binding? (WPF .NET)

Nel data binding l'oggetto origine del binding fa riferimento all'oggetto da cui si ottengono i dati. Questo articolo illustra i tipi di oggetti che è possibile usare come origine di associazione, ad esempio oggetti CLR .NET, XML e DependencyObject oggetti.

Tipi di origine dell'associazione

Il data binding di Windows Presentation Foundation (WPF) supporta i tipi di origine di binding seguenti:

  • Oggetti CLR (Common Language Runtime) .NET

    È possibile eseguire il binding a proprietà pubbliche, sottoproprietà e indicizzatori di qualsiasi oggetto CLR (Common Language Runtime). Il motore di associazione usa la reflection CLR per ottenere i valori delle proprietà. Gli oggetti che implementano ICustomTypeDescriptor o dispongono di un oggetto registrato TypeDescriptionProvider funzionano anche con il motore di associazione.

    Per altre informazioni su come implementare una classe che può fungere da origine di associazione, vedere Implementazione di un'origine di associazione negli oggetti più avanti in questo articolo.

  • Oggetti dinamici

    È possibile eseguire il binding a proprietà e indicizzatori disponibili di un oggetto che implementa l'interfaccia IDynamicMetaObjectProvider . Se è possibile accedere al membro nel codice, è possibile creare un'associazione a tale membro. Se ad esempio un oggetto dinamico consente di accedere a un membro nel codice tramite SomeObject.AProperty, è possibile creare un'associazione al membro impostando il percorso di associazione su AProperty.

  • oggetti ADO.NET

    È possibile eseguire l'associazione a ADO.NET oggetti, ad esempio DataTable. Il ADO.NET DataView implementa l'interfaccia IBindingList , che fornisce notifiche di modifica per cui il motore di associazione è in ascolto.

  • Oggetti XML

    È possibile associare ed eseguire XPath query in un XmlNodeoggetto , XmlDocumento XmlElement. Un modo pratico per accedere ai dati XML che costituiscono l'origine di associazione nel markup consiste nell'usare un XmlDataProvider oggetto . Per altre informazioni, vedere Eseguire l'associazione a dati XML tramite xmlDataProvider e query XPath (.NET Framework).For more information, see Bind to XML Data Using an XMLDataProvider and XPath Queries (.NET Framework).

    È anche possibile eseguire l'associazione a un XElement oggetto o XDocumentoppure eseguire l'associazione ai risultati delle query eseguite su oggetti di questi tipi usando LINQ to XML. Un modo pratico per usare LINQ to XML per accedere ai dati XML che costituiscono l'origine di associazione nel markup consiste nell'usare un ObjectDataProvider oggetto . Per altre informazioni, vedere Eseguire il binding a XDocument, XElement o LINQ for XML Query Results (.NET Framework).

  • DependencyObject Oggetti

    È possibile eseguire il binding alle proprietà di dipendenza di qualsiasi DependencyObjectoggetto . Per un esempio, vedere Associare le proprietà di due controlli (.NET Framework).

Implementare un'origine di associazione sugli oggetti

Gli oggetti CLR possono diventare origini di associazione. Quando si implementa una classe da usare come origine di associazione, è necessario tenere presente alcuni aspetti.

Fornire notifiche di modifica

Se si usa o si usa un'associazione OneWay TwoWay , implementare un meccanismo di notifica di tipo "property changed" appropriato. Il meccanismo consigliato è per CLR o la classe dinamica per implementare l'interfaccia INotifyPropertyChanged . Per altre informazioni, vedere Procedura: Implementare la notifica delle modifiche delle proprietà (.NET Framework).

Esistono due modi per notificare a un sottoscrittore una modifica della proprietà:

  • Implementare l'interfaccia INotifyPropertyChanged.

    Questo è il meccanismo consigliato per le notifiche. Fornisce INotifyPropertyChanged l'evento PropertyChanged , che il sistema di associazione rispetta. Generando questo evento e specificando il nome della proprietà modificata, si invierà una notifica a una destinazione di associazione della modifica.

  • Implementare il PropertyChanged modello.

    Ogni proprietà che deve notificare a una destinazione di associazione che viene modificata ha un evento corrispondente PropertyNameChanged , dove PropertyName è il nome della proprietà. L'evento viene generato a ogni modifica della proprietà.

Se l'origine del binding implementa uno di questi meccanismi di notifica, gli aggiornamenti della destinazione vengono eseguiti automaticamente. Se per qualsiasi motivo l'origine dell'associazione non fornisce le notifiche appropriate di modifica delle proprietà, è possibile usare il UpdateTarget metodo per aggiornare la proprietà di destinazione in modo esplicito.

Altre caratteristiche

L'elenco seguente indica altri punti importanti.

  • Gli oggetti dati che fungono da origini di associazione possono essere dichiarati in XAML come risorse, purché abbiano un costruttore senza parametri. In caso contrario, è necessario creare l'oggetto dati nel codice e assegnarlo direttamente al contesto dati dell'albero degli oggetti XAML o come origine di binding dell'associazione.

  • Le proprietà usate come proprietà di origine dell'associazione devono essere proprietà pubbliche della classe. Non è possibile accedere alle proprietà dell'interfaccia definite in modo esplicito a scopo di associazione né a proprietà protette, private, interne o virtuali senza implementazione di base.

  • Non è possibile eseguire l'associazione ai campi pubblici.

  • Il tipo della proprietà dichiarata nella classe è il tipo passato al binding. Il tipo usato in ultima analisi dal binding dipende tuttavia dal tipo della proprietà della destinazione del binding, non della proprietà di origine del binding. Se esiste una differenza di tipo, potrebbe essere necessario scrivere un convertitore per gestire il modo in cui la proprietà personalizzata viene inizialmente passata all'associazione. Per ulteriori informazioni, vedere IValueConverter.

Interi oggetti come origine di associazione

È possibile usare un oggetto intero come origine del binding. Specificare un'origine di associazione usando o Source la DataContext proprietà e quindi specificare una dichiarazione di associazione vuota: {Binding}. Gli scenari in cui ciò è utile includono l'associazione a oggetti di tipo stringa, l'associazione a oggetti con più proprietà a cui si è interessati o l'associazione a oggetti della raccolta. Per un esempio di associazione a un intero oggetto raccolta, vedere How to Use the Master-Detail Pattern with Hierarchical Data (.NET Framework).

Affinché i dati siano significativi per la proprietà di destinazione associata, può essere necessario applicare logica personalizzata. La logica personalizzata può essere sotto forma di convertitore personalizzato o .DataTemplate Per altre informazioni sui convertitori, vedere Conversione dei dati. Per altre informazioni sui modelli di dati, vedere Panoramica dei modelli di modelli di dati (.NET Framework).

Oggetti raccolta come origine di associazione

L'oggetto da usare come origine del binding corrisponde a una raccolta di oggetti personalizzati. Ogni oggetto funge da origine per un'istanza di un binding ripetuto. Ad esempio, potrebbe essere presente una CustomerOrders raccolta costituita da oggetti, in cui l'applicazione esegue l'iterazione sulla raccolta per determinare il numero di CustomerOrder ordini esistenti e i dati contenuti in ogni ordine.

È possibile eseguire l'enumerazione su qualsiasi raccolta che implementa l'interfaccia IEnumerable. Tuttavia, per configurare binding dinamici in modo che gli inserimenti o le eliminazioni di elementi nella raccolta comportino l'aggiornamento automatico dell'interfaccia utente, la raccolta deve implementare l'interfaccia INotifyCollectionChanged. Questa interfaccia espone un evento che deve essere generato a ogni modifica della raccolta sottostante.

La ObservableCollection<T> classe è un'implementazione predefinita di una raccolta di dati che espone l'interfaccia INotifyCollectionChanged . I singoli oggetti dati nella raccolta devono soddisfare i requisiti descritti nelle sezioni precedenti. Per un esempio, vedere How to Create and Bind to an ObservableCollection (.NET Framework). Prima di implementare la propria raccolta, è consigliabile usare ObservableCollection<T> o una delle classi di raccolta esistenti, ad esempio List<T>, Collection<T>e BindingList<T>, tra le altre.

Quando si specifica una raccolta come origine di associazione, WPF non viene associato direttamente alla raccolta. WPF associa invece alla visualizzazione predefinita della raccolta. Per informazioni sulle visualizzazioni predefinite, vedere Uso di una visualizzazione predefinita.

Se si ha uno scenario avanzato e si vuole implementare la propria raccolta, è consigliabile usare l'interfaccia IList . Questa interfaccia fornisce una raccolta non generica di oggetti a cui è possibile accedere singolarmente in base all'indice, che può migliorare le prestazioni.

Requisiti di autorizzazione nel data binding

A differenza di .NET Framework, .NET viene eseguito con sicurezza completamente attendibile. Tutto il data binding viene eseguito con lo stesso accesso dell'utente che esegue l'applicazione.

Vedi anche