Il Binding di WPF è uno strumento molto potente che svolge un ruolo fondamentale nelle applicazioni che si sviluppano. Solitamente si sfruttano il DataContext oppure le proprietà Source e ElementName per impostare la sorgente che fa da base dati o l'elemento al quale si vuole riferire.
In alcuni casi queste proprietà non bastano, perché la sorgente dati non è il contesto attuale oppure, se si sviluppano template, occorre caricare informazioni del controllo. La MarkupExtension RelativeSource risolve questo problema e permette di cercare la sorgente relativa in quattro modalità.
La modalità Self usa come sorgente l'oggetto stesso sul quale si sta applicando il Binding. L'esempio seguente carica come contenuto la proprietà Width del pulsante e mostra quindi 100:
<Button Content="{Binding RelativeSource={RelativeSource Self},Path=Width}" Width="100" />La modalità TemplatedParent permette di riferirsi all'elemento sul quale si sta creando il template. E' simile alla MarkupExtension TemplateBinding, ma è più versatile poiché l'oggetto Binding ha più funzionalità e converte in automatico i tipi. In caso questa versatilità non serva è meglio ricorrere sempre all'uso di TemplateBinding. Ampliando l'esempio precedente, si applica uno template al pulsante e si sfrutta questa modalità per caricare come string il Content. Poiché il Content è un numero, mentre la proprietà Text del TextBlock è una stringa, la MarkupExtension TemplateBinding non può essere usata:
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>La modalità FindAncestor semplicemente cerca, risalendo gli alberi degli elementi, un determinato tipo permettendo inoltre di specificare il livello. L'esempio seguente carica la proprietà LastChildFill cercando il DockPanel che sta alla radice del pulsante:
<DockPanel LastChildFill="True">
<Button Content="{Binding RelativeSource={RelativeSource FindAncestor,{x:Type DockPanel},1},Path=LastChildFill}" />
</DockPanel>La modalità PreviousData invece si utilizza quando un IEnumerable viene caricato e da un item (solitamente nel DataTemplate) si vuole riferire all'item che lo precede. Il template seguente per esempio carica sia l'item corrente che quello precedente:
<DataTemplate x:Key="d">
<StackPanel>
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding RelativeSource={RelativeSource PreviousData}}" />
</StackPanel>
</DataTemplate>Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Esaminare documenti con namespace con LINQ e XDocument
- Accedere a dati esposti con WebService con Silverlight 1.0
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit


