Panoramica delle origini di associazione
Nel data binding l'oggetto origine del binding fa riferimento all'oggetto da cui si ottengono i dati. Questo argomento descrive i tipi di oggetti che è possibile usare come origine del binding.
Tipi di origine del binding
Il data binding di Windows Presentation Foundation (WPF) supporta i tipi di origine di binding seguenti:
Origine del binding | Descrizione |
---|---|
Oggetti CLR (Common Language Runtime) | È possibile eseguire il binding a proprietà pubbliche, sottoproprietà, nonché indicizzatori, di qualsiasi oggetto CLR (Common Language Runtime). Il motore di associazione usa la reflection CLR per ottenere i valori delle proprietà. In alternativa, gli oggetti che implementano ICustomTypeDescriptor o hanno un registrato TypeDescriptionProvider funzionano anche con il motore di associazione. Per altre informazioni su come implementare una classe che possa essere usata come origine del binding, vedere Implementazione di una classe come origine del binding più avanti in questo argomento. |
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 Procedura: Eseguire l'associazione a dati XML tramite un oggetto XMLDataProvider e query XPath.È 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 Procedura: Eseguire l'associazione ai risultati di una query XDocument, XElement o LINQ to XML. |
Oggetti DependencyObject | È possibile eseguire il binding alle proprietà di dipendenza di qualsiasi DependencyObjectoggetto . Per un esempio, vedere Eseguire l'associazione delle proprietà di due controlli. |
Implementazione di una classe come origine del binding
È possibile creare origini del binding personalizzate. Questa sezione illustra i concetti necessari per l'implementazione di una classe da usare come origine del binding.
Invio di notifiche delle modifiche
Se usi o OneWay TwoWay binding (perché vuoi che l'interfaccia utente venga aggiornata quando le proprietà dell'origine di associazione cambiano in modo dinamico), devi implementare un meccanismo di notifica appropriato per la modifica delle proprietà. Il meccanismo consigliato è per CLR o la classe dinamica per implementare l'interfaccia INotifyPropertyChanged . Per altre informazioni, vedere Implementare la notifica di modifiche alle proprietà.
Se si crea un oggetto CLR che non implementa INotifyPropertyChanged, è necessario disporre per il proprio sistema di notifica per assicurarsi che i dati usati in un'associazione rimangano aggiornati. È possibile offrire notifiche delle modifiche tramite il supporto del modello PropertyChanged
per ogni proprietà per cui si desidera impostarle. Per supportare questo modello, definire un evento NomeProprietàChanged per ogni proprietà, dove NomeProprietà è 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 relative alle modifiche alle proprietà, è possibile usare il UpdateTarget metodo per aggiornare la proprietà di destinazione in modo esplicito.
Altre caratteristiche
L'elenco seguente indica altri punti importanti.
Se vuoi creare l'oggetto in XAML, la classe deve avere un costruttore senza parametri. In alcuni linguaggi .NET, ad esempio C#, è possibile creare automaticamente il costruttore senza parametri.
Le proprietà usate come proprietà di origine del binding per un binding devono essere proprietà pubbliche della classe. Non è possibile accedere alle proprietà dell'interfaccia definite in modo esplicito a scopo di associazione né alle proprietà protette, private, interne o virtuali prive di un'implementazione di base.
Non è possibile stabilire l'associazione a 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 è presente una differenza nel tipo, è necessario scrivere un convertitore per gestire la modalità di passaggio iniziale della proprietà personalizzata al binding. Per ulteriori informazioni, vedere IValueConverter.
Uso di oggetti interi come origine del binding
È possibile usare un oggetto intero come origine del binding. È possibile specificare un'origine di associazione usando o Source la DataContext proprietà e quindi specificare una dichiarazione di associazione vuota: {Binding}
. Alcuni scenari per i quali questa possibilità risulta utile sono l'associazione a oggetti di tipo stringa, l'associazione a oggetti con più proprietà di interesse o l'associazione a oggetti Collection. Per un esempio di associazione a un intero oggetto Collection, vedere Usare il modello Master-Detail con dati gerarchici.
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 (se la conversione del tipo predefinito non esiste) o un oggetto DataTemplate. Per altre informazioni sui convertitori, vedere la sezione sulla conversione dei dati in Panoramica sul data binding. Per altre informazioni sui modelli di dati, vedere Cenni preliminari sui modelli di dati.
Uso di oggetti Collection come origine del binding
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. Se ad esempio si dispone di una raccolta CustomerOrders
che include di oggetti CustomerOrder
, l'applicazione scorrerà la raccolta per determinare il numero di ordini inclusi e i dati contenuti in ognuno di essi.
È 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 Procedura: Creare ed eseguire l'associazione a una classe ObservableCollection. Prima di implementare una raccolta personalizzata, è consigliabile usare ObservableCollection<T> o una delle classi di raccolta esistenti, ad esempio List<T>, Collection<T>, BindingList<T> e così via.
WPF non esegue mai direttamente l'associazione a una raccolta. Se si specifica una raccolta come origine del binding, WPF esegue effettivamente il binding alla visualizzazione predefinita della raccolta stessa. Per informazioni sulle visualizzazioni predefinite, vedere Panoramica sul data binding.
Se si ha uno scenario avanzato e si vuole implementare la propria raccolta, è consigliabile usare l'interfaccia IList . IList fornisce una raccolta non generica di oggetti a cui è possibile accedere singolarmente in base all'indice, che può migliorare le prestazioni.
Requisiti di autorizzazione in un data binding
Quando si crea un data binding, è necessario considerare il livello di attendibilità dell'applicazione. La tabella seguente riepiloga i tipi di proprietà a cui è possibile stabilire l'associazione in un'applicazione eseguita con attendibilità totale o parziale.
Tipo di proprietà (tutti i modificatori di accesso) |
Proprietà dell'oggetto dinamico | Proprietà dell'oggetto dinamico | Proprietà CLR | Proprietà CLR | Proprietà di dipendenza | Proprietà di dipendenza |
---|---|---|---|---|---|---|
Livello di attendibilità | Attendibilità totale | Attendibilità parziale | Attendibilità totale | Attendibilità parziale | Attendibilità totale | Attendibilità parziale |
Classe pubblica | Sì | Sì | Sì | Sì | Sì | Sì |
Classe non pubblica | Sì | No | Sì | No | Sì | Sì |
Questa tabella descrive punti importanti relativi ai requisiti di autorizzazione per il data binding.
Per le proprietà CLR, il data binding funziona finché il motore di associazione è in grado di accedere alla proprietà di origine dell'associazione tramite reflection. In caso contrario, viene generato un avviso relativo all'impossibilità di trovare la proprietà e viene usato il valore di fallback o quello predefinito, se disponibile.
È possibile creare associazioni alle proprietà degli oggetti dinamici definiti in fase di compilazione o di esecuzione.
È sempre possibile stabilire l'associazione alle proprietà di dipendenza.
Il requisito di autorizzazione per l'associazione XML è simile. In una sandbox parzialmente attendibile, XmlDataProvider non riesce quando non dispone delle autorizzazioni per accedere ai dati specificati.
Gli oggetti con un tipo anonimo sono interni. È possibile creare associazioni a proprietà di tipi anonimi solo in fase di esecuzione con attendibilità totale. Per altre informazioni sui tipi anonimi, vedere Tipi anonimi (Guida per programmatori C#) o Tipi anonimi (Visual Basic).
Per altre informazioni sulla sicurezza con attendibilità parziale, vedere Sicurezza con attendibilità parziale in WPF.
Vedi anche
.NET Desktop feedback