
Creazione di un'associazione
Nella presente sezione sono contenute le seguenti sottosezioni.
Per riepilogare alcuni dei concetti illustrati nelle sezioni precedenti, un'associazione viene stabilita utilizzando l'oggetto Binding e ogni associazione è costituita in genere da quattro componenti: la destinazione dell'associazione, la proprietà di destinazione, l'origine dell'associazione e un percorso del valore di origine da utilizzare. In questa sezione viene illustrato come impostare un'associazione.
Si consideri il seguente esempio, nel quale l'oggetto origine dell'associazione è una classe denominata MyData definita nello spazio dei nomi SDKSample. A scopo dimostrativo, la classe MyData possiede una proprietà stringa denominata ColorName il cui valore è impostato su "Red". In questo esempio viene quindi generato un pulsante con uno sfondo rosso.
<DockPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:SDKSample">
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<DockPanel.DataContext>
<Binding Source="{StaticResource myDataSource}"/>
</DockPanel.DataContext>
<Button Background="{Binding Path=ColorName}"
Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>
Per maggiori dettagli sulla sintassi della dichiarazione di associazione e alcuni esempi di impostazione di un'associazione nel codice, vedere Cenni preliminari sulle dichiarazioni di associazione.
Applicando questo esempio allo schema di base, risulterà una figura analoga alla seguente. Si tratta di un'associazione OneWay in quanto, per impostazione predefinita, la proprietà Background supporta questo tipo di associazione.
.png)
Ci si potrebbe chiedere come sia possibile tale associazione, dal momento che la proprietà ColorName è di tipo stringa mentre la proprietà Background è di tipo Brush. In questo caso viene utilizzata la conversione di tipi predefinita, illustrata nella sezione Conversione dei dati.
Specificazione dell'origine dell'associazione
Nell'esempio precedente, l'origine dell'associazione viene specificata impostando la proprietà DataContext nell'elemento DockPanel. Button eredita quindi il valore di DataContext da DockPanel, il quale costituisce l'elemento padre. Come già detto, l'oggetto origine dell'associazione è uno dei quattro componenti necessari di un'associazione. Di conseguenza, se non si specifica l'oggetto origine dell'associazione, questa non viene creata.
Esistono diversi modi per specificare l'oggetto origine dell'associazione. L'utilizzo della proprietà DataContext in un elemento padre è utile in caso di associazione di più proprietà alla stessa origine. In alcuni casi, tuttavia, è preferibile specificare l'origine dell'associazione in singole dichiarazioni di associazione. Nel caso dell'esempio precedente, anziché utilizzare la proprietà DataContext, è possibile specificare l'origine dell'associazione impostando la proprietà Source direttamente nella dichiarazione di associazione del pulsante, come avviene nell'esempio che segue:
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
Background="{Binding Source={StaticResource myDataSource},
Path=ColorName}">I am bound to be RED!</Button>
Oltre a impostare la proprietà DataContext direttamente in un elemento, ereditare il valore di DataContext da un predecessore (si veda il pulsante nel primo esempio) e specificare in modo esplicito l'origine dell'associazione impostando la proprietà Source in Binding (si veda il pulsante nell'ultimo esempio), è anche possibile utilizzare la proprietà ElementName o la proprietà RelativeSource per specificare l'origine dell'associazione. La proprietà ElementName è utile in caso di associazione ad altri elementi nell'applicazione, ad esempio in caso di utilizzo di un dispositivo di scorrimento per regolare la larghezza di un pulsante. La proprietà RelativeSource è utile nel caso di un'associazione specificata in un oggetto ControlTemplate o Style. Per ulteriori informazioni, vedere Procedura: specificare l'origine di associazione.
Specificazione del percorso del valore
Se l'origine dell'associazione è un oggetto, si utilizza la proprietà Path per specificare il valore da utilizzare per l'associazione. In caso di associazione a dati XML, utilizzare la proprietà XPath per specificare il valore. In alcuni casi è possibile utilizzare la proprietà Path anche se i dati sono in formato XML. Ad esempio, per accedere alla proprietà Name di un XmlNode restituito in seguito a una query XPath, è necessario utilizzare la proprietà Path oltre alla proprietà XPath.
Per informazioni sulla sintassi e alcuni esempi, vedere le pagine delle proprietà Path e XPath.
Benché sia stato sottolineato che la proprietà Path del valore da utilizzare è uno dei quattro componenti necessari di un'associazione, negli scenari di associazione a un intero oggetto il valore da utilizzare corrisponde all'oggetto origine dell'associazione. In tali casi è possibile non specificare Path. Si consideri l'esempio seguente:
<ListBox ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="true"/>
Nell'esempio viene utilizzata la sintassi di associazione vuota: {Binding}. In questo caso, ListBox eredita DataContext da un elemento DockPanel padre, assente nell'esempio. Quando il percorso non viene specificato, per impostazione predefinita si esegue un'associazione all'intero oggetto. In altre parole, in questo esempio il percorso è stato tralasciato poiché la proprietà ItemsSource viene associata all'intero oggetto. Per informazioni più dettagliate, vedere la sezione Associazione agli insiemi.
Diversamente dall'associazione a un insieme, questo scenario è utile anche in caso di associazione a un intero oggetto anziché a un'unica proprietà di un oggetto. Si consideri ad esempio un oggetto origine di tipo stringa con un'associazione alla stringa stessa. Un altro scenario comune riguarda l'associazione di un elemento a un oggetto con diverse proprietà.
Alcuni scenari richiedono l'applicazione di una logica personalizzata affinché i dati siano significativi per la proprietà di destinazione associata. Tale logica potrebbe essere un convertitore personalizzato, in assenza della conversione di tipi predefinita. Per informazioni sui convertitori, vedere Conversione dei dati.
Binding e BindingExpression
Prima di analizzare altre funzionalità e modalità di utilizzo dell'associazione dati, è opportuno introdurre la classe BindingExpression. Come si è visto nelle sezioni precedenti, la classe Binding è la classe di alto livello per la dichiarazione di un'associazione e fornisce diverse proprietà che consentono di specificare le caratteristiche dell'associazione. Una classe correlata, BindingExpression, è l'oggetto sottostante che gestisce la connessione tra origine e destinazione. Un'associazione contiene tutte le informazioni condivisibili tra diverse espressioni di associazione. BindingExpression è un'espressione di istanza non condivisibile e contiene tutte le informazioni sull'istanza di Binding.
Si consideri l'esempio che segue, nel quale myDataObject è un'istanza della classe MyData, myBinding è l'oggetto Binding di origine e la classe MyData è una classe definita contenente una proprietà stringa denominata MyDataProperty. Nell'esempio viene associato il contenuto di testo di mytext, un'istanza di TextBlock, a MyDataProperty.
Dim data1 As New MyData(DateTime.Now)
Dim binding1 As New Binding("MyDataProperty")
binding1.Source = data1
Me.myText.SetBinding(TextBlock.TextProperty, binding1)
//make a new source
MyData myDataObject = new MyData(DateTime.Now);
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);
È possibile utilizzare lo stesso oggetto myBinding per creare altre associazioni. Ad esempio, è possibile utilizzare l'oggetto myBinding per associare il contenuto di testo di una casella di controllo a MyDataProperty. In un simile scenario si avranno due istanze di BindingExpression che condividono l'oggetto myBinding.
Un oggetto BindingExpression può essere ottenuto tramite il valore restituito di una chiamata a GetBindingExpression in un oggetto con associazione a dati. Negli argomenti che seguono vengono illustrate alcune modalità di utilizzo della classe BindingExpression: