Cenni preliminari sulle dichiarazioni di associazione
Aggiornamento: novembre 2007
In questo argomento vengono presentati i diversi modi in cui è possibile dichiarare un'associazione.
Nel presente argomento sono contenute le seguenti sezioni.
- Prerequisiti
- Dichiarazione di un'associazione in XAML
- Creazione di un'associazione nel codice
- Sintassi del percorso di associazione
- Comportamenti predefiniti
- Argomenti correlati
Prerequisiti
Prima di leggere questo argomento, è importante avere familiarità con il concetto e l'utilizzo delle estensioni di markup. Per ulteriori informazioni sulle estensioni di markup, vedere Estensioni di markup e XAML.
In questo argomento non vengono illustrati i concetti relativi all'associazione dati. Per informazioni sui concetti relativi all'associazione dati, vedere Cenni preliminari sull'associazione dati.
Dichiarazione di un'associazione in XAML
In questa sezione viene illustrata la modalità di dichiarazione di un'associazione in Extensible Application Markup Language (XAML).
Utilizzo delle estensioni di markup
Binding è un'estensione di markup. Quando si utilizza l'estensione dell'associazione per dichiarare un'associazione, tale dichiarazione sarà costituita da una serie di clausole che seguono la parola chiave Binding e sono separate tramite virgole (,). Le clausole della dichiarazione di associazione possono essere disposte in qualsiasi ordine, fornendo così molte possibili combinazioni. Le clausole sono composte da coppie Nome=Valore, dove Nome corrisponde al nome della proprietà Binding e Valore corrisponde al valore che si imposta per la proprietà.
Quando si creano stringhe di dichiarazione di associazione nel markup, queste devono essere associate alla proprietà di dipendenza specifica di un oggetto di destinazione. Nell'esempio seguente viene illustrato come associare la proprietà TextBox.Text utilizzando l'estensione dell'associazione e specificando le proprietà Source, Path e UpdateSourceTrigger.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
È possibile specificare la maggior parte delle proprietà della classe Binding in questo modo. Per ulteriori informazioni sull'estensione dell'associazione e per un elenco di proprietà Binding che non possono essere impostate utilizzando l'estensione dell'associazione, vedere i cenni preliminari su Associazione dell'estensione di markup.
Sintassi per elementi oggetto
La sintassi per elementi oggetto rappresenta un'alternativa alla creazione della dichiarazione di associazione. Nella maggior parte dei casi, l'utilizzo dell'estensione di markup rispetto alla sintassi per elementi oggetto non presenta specifici vantaggi. Tuttavia, nei casi in cui l'estensione di markup non supporta uno specifico scenario, ad esempio quando il valore della proprietà è di un tipo non stringa per il quale non sono previste conversioni di tipo, sarà necessario utilizzare la sintassi per elementi oggetto.
Di seguito viene riportato un esempio dell'utilizzo sia della sintassi per elementi oggetto, sia dell'estensione di markup:
<TextBlock Name="myconvertedtext"
Foreground="{Binding Path=TheDate,
Converter={StaticResource MyConverterReference}}">
<TextBlock.Text>
<Binding Path="TheDate"
Converter="{StaticResource MyConverterReference}"/>
</TextBlock.Text>
</TextBlock>
Nell'esempio, la proprietà Foreground viene associata dichiarando un'associazione tramite la sintassi di estensione. La dichiarazione di associazione per la proprietà Text utilizza la sintassi per elementi oggetto.
Per ulteriori informazioni sui diversi termini, vedere Terminologia della sintassi XAML.
MultiBinding e PriorityBinding
MultiBinding e PriorityBinding non supportano la sintassi di estensioneXAML. Pertanto, se si sta dichiarando un oggetto MultiBinding o PriorityBinding in XAML, è necessario utilizzare la sintassi per elementi oggetto.
Creazione di un'associazione nel codice
Un altro modo per specificare un'associazione consiste nell'impostare le proprietà direttamente su un oggetto Binding nel codice. Nell'esempio seguente viene illustrato il modo per creare un oggetto Binding e specificare le proprietà nel codice:
private void OnPageLoaded(object sender, EventArgs e)
{
// Make a new source, to grab a new timestamp
MyData myChangedData = new MyData();
// Create a new binding
// TheDate is a property of type DateTime on MyData class
Binding myNewBindDef = new Binding("TheDate");
myNewBindDef.Mode = BindingMode.OneWay;
myNewBindDef.Source = myChangedData;
myNewBindDef.Converter = TheConverter;
myNewBindDef.ConverterCulture = new CultureInfo("en-US");
// myDatetext is a TextBlock object that is the binding target object
BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);
...
}
Se l'oggetto di cui si esegue l'associazione è FrameworkElement o FrameworkContentElement, è possibile chiamare il metodo SetBinding direttamente sull'oggetto anziché utilizzare BindingOperations.SetBinding. Per un esempio, vedere Procedura: creare associazioni nel codice.
Sintassi del percorso di associazione
Utilizzare la proprietà Path per specificare il valore di origine al quale si desidera eseguire l'associazione:
Nel caso più semplice, il valore della proprietà Path è il nome della proprietà dell'oggetto di origine da utilizzare per l'associazione, ad esempio Path=PropertyName.
Le sottoproprietà di una proprietà possono essere specificate tramite una sintassi simile a quella utilizzata in C#. La clausola Path=ShoppingCart.Order, ad esempio, imposta l'associazione sulla sottoproprietà Order dell'oggetto o sulla proprietà ShoppingCart.
Per eseguire l'associazione a una proprietà associata, racchiudere tra parentesi la proprietà associata. Ad esempio, per eseguire l'associazione alla proprietà associata DockPanel.Dock, la sintassi utilizzata sarà Path=(DockPanel.Dock).
Gli indicizzatori di una proprietà possono essere specificati all'interno di parentesi quadre dopo il nome della proprietà in cui viene applicato l'indicizzatore. Ad esempio, con la clausola Path=ShoppingCart[0] viene impostata l'associazione all'indice corrispondente al modo in cui l'indicizzazione interna della proprietà gestisce la stringa letterale "0". Sono supportati anche indicizzatori nidificati.
È possibile combinare indicizzatori e sottoproprietà all'interno di una clausola Path; ad esempio, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].
All'interno degli indicizzatori possono essere presenti più parametri dell'indicizzatore separati da virgole (,). Il tipo di ogni parametro può essere specificato tra parentesi. Nel caso di Path="[(sys:Int32)42,(sys:Int32)24]", ad esempio, è stato eseguito il mapping di sys allo spazio dei nomi System.
Quando l'origine è una visualizzazione di insieme, l'elemento corrente può essere specificato con una barra (/). Ad esempio, la clausola Path=/ imposta l'associazione sull'elemento corrente nella visualizzazione. Quando l'origine è un insieme, questa sintassi specifica l'elemento corrente della visualizzazione di insieme predefinita.
Le barre e i nomi delle proprietà possono essere combinati per attraversare proprietà che corrispondono a insiemi. Ad esempio, Path=/Offices/ManagerName specifica l'elemento corrente dell'insieme di origine contenente una proprietà Offices che corrisponde anche a un insieme. L'elemento corrente è un oggetto che contiene una proprietà ManagerName.
Facoltativamente, è possibile utilizzare un percorso con il punto (.) per eseguire l'associazione all'origine corrente. Ad esempio Text=”{Binding}” è equivalente a Text=”{Binding Path=.}”.
Meccanismo di escape
All'interno degli indicizzatori ([ ]), l'accento circonflesso (^) funge da escape per il carattere successivo.
Se si imposta Path in XAML, sarà necessario utilizzare caratteri di escape (entità XML) anche per alcuni caratteri speciali del parser XML:
Utilizzare & come carattere di escape per il carattere "&".
Utilizzare > come carattere di escape per il tag di fine ">".
Inoltre, se si descrive l'intera associazione di un attributo utilizzando la sintassi dell'estensione di markup, sarà necessario utilizzare un carattere di escape (una barra rovesciata \), per i caratteri speciali del parser dell'estensione di markup WPF:
La stessa barra rovesciata (\) costituisce il carattere di escape.
Il segno di uguale (=) separa il nome della proprietà dal valore della proprietà.
Le proprietà vengono separate tramite virgola (,).
La parentesi graffa di destra (}) rappresenta la fine di un'estensione di markup.
Comportamenti predefiniti
Di seguito viene indicato il comportamento predefinito nel caso in cui non sia specificato nella dichiarazione.
Viene creato un convertitore predefinito che tenta di eseguire una conversione di tipo tra il valore dell'origine dell'associazione e il valore della destinazione dell'associazione. Se non è possibile eseguire una conversione, il convertitore predefinito restituisce null.
Se non viene impostato ConverterCulture, il motore di associazione utilizza la proprietà Language dell'oggetto di destinazione dell'associazione. In XAML quest'ultimo viene impostato in modalità predefinita su "en-US" oppure eredita il valore dall'elemento radice (o da qualsiasi elemento) della pagina, qualora ne sia stato impostato uno in modo esplicito.
Se l'associazione dispone già di un contesto dati (ad esempio, il contesto dati ereditato da un elemento padre) e indipendentemente da quale elemento o insieme restituito da quel contesto risulti adatto all'associazione senza richiedere ulteriori modifiche del percorso, una dichiarazione di associazione può essere del tutto priva di clausole: {Binding}. Si tratta della modalità con la quale viene spesso specificata un'associazione per l'applicazione di stili ai dati, se l'associazione agisce su un insieme. Per ulteriori informazioni, vedere la sezione relativa agli oggetti interi utilizzati come origine dell'associazione in Cenni preliminari sulle origini di associazione.
L'oggetto Mode predefinito può essere unidirezionale o bidirezionale a seconda della proprietà di dipendenza di cui si esegue l'associazione. È sempre possibile dichiarare in modo esplicito la modalità di associazione per garantire che il relativo comportamento sia quello desiderato. In generale, le proprietà di controllo modificabili dall'utente, ad esempio TextBox.Text e RangeBase.Value sono impostate in modalità predefinita su associazioni bidirezionali, mentre la maggior parte delle altre proprietà sono impostate in modalità predefinita su associazioni unidirezionali.
Il valore predefinito di UpdateSourceTrigger può variare da PropertyChanged a LostFocus anche in questo caso a seconda della proprietà di dipendenza associata. Il valore predefinito per la maggior parte delle proprietà di dipendenza è PropertyChanged, mentre la proprietà TextBox.Text ha un valore predefinito di LostFocus.
Vedere anche
Concetti
Cenni preliminari sull'associazione dati
Ottimizzazione delle prestazioni: associazione dati