Dall'archivio articoli > Silverlight
Tutte le novità di Silverlight 5.0 - parte prima
Per poter utilizzare questa funzionalità, devi fare il login o iscriverti.
Nel corso degli anni abbiamo appreso che la direzione di sviluppo di Silverlight è stata fortemente orientata ad affiancare WPF come framework completo per realizzare applicazioni desktop, pur mantenendo la propria identità nel contesto di plugin per applicazioni web in-browser. Semplicità, performance e "gestibilità" con tool come Expression Blend ha consentito al plugin di ricevere grandi consensi, con adozioni anche in applicazioni enterprise, tanto da spingere Microsoft a proseguire nello sviluppo sempre più nella direzione di ridurre la forbice che lo separa da WPF, sia come compatibilità del markup che come funzionalità di accesso diretto alle risorse del client.
La quinta versione rappresenta un vero cambio di marcia nella corsa all'obiettivo di trasformare il plugin a vero framework. Vediamo i nuovi strumenti che abbiamo a disposizione iniziando dalle novità introdotte nel markup.
La Binding markup extension è una delle funzionalità chiave di XAML, alla nota proprietà RelativeSource, oltre a TemplatedParent e Self, è stata aggiunta la possibilità di raggiungere un controllo contenitore di un certo tipo e/o ad un certo livello nella gerarchia dei controlli parent. Abbiamo questa possibilità grazie alle proprietà AncestorType e AncestorLevel. Ecco di seguito un esempio di markup che ne fa utilizzo.
<DataTemplate x:Key="dt1"> <Grid> <Button Content="Button" Command="{Binding RelativeSource={RelativeSource AncestorType=ListBox, AncestorLevel=5}, Path=DataContext.ViewDetailsCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=SelectedItem}" /> </Grid> </DataTemplate>
Possiamo immaginare che il Button del codice dell'esempio sia renderizzato all'interno di ogni elemento di un ItemsControl per effetto della risoluzione dell'ItemTemplate.Come noto, il DataContext di tale elemento è il singolo oggetto in binding, grazie a RelativeSource AncestorType possiamo raggiungiungere l'ItemsControl che lo contiene ed il suo ViewModel (il DataContext principale), in modo da agganciare un Command in modo centralizzato nel ViewModel dello UserControl stesso.Inoltre, attraverso la proprietà CommandParameter possiamo passare direttamente al Command l'oggetto in binding all'elemento che contiene il Button:
private RelayCommand<MenuItem> viewDetailsCommand; public RelayCommand<MenuItem> ViewDetailsCommand { get { return this.viewDetailsCommand ?? (this.viewDetailsCommand = new RelayCommand<MenuItem>( (items) => { //TODO: }, (items) => { return true; })); } }
Le potenzialità di queste nuove estensioni di RelativeSource ci permettono di mantenere il codice semplice e ben manutenibile.
Nella definizione di uno Style di un controllo possiamo dichiarare in modo centralizzato il valore di alcune proprietà, in modo da riutilizzarle in più contesti e renderle facilmente manutenibili nel tempo. Alla dichiarazione del value dei Setter è stato aggiunto il supporto alle espressioni di Binding, questo significa che il valore stesso non è cablato nel markup ma può essere risolto in real time dall'engine, ad esempio attraverso un'oggetto gestito come StaticResource. Ecco un esempio:
<Style TargetType="Button"> <Setter Property="Margin" Value="5" /> <Setter Property="Foreground" Value="{Binding Foreground, Source={StaticResource StyleManager}}" /> <Setter Property="FontSize" Value="10" /> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="VerticalAlignment" Value="Center" /> </Style>
Nello snippet precedente il valore della proprietà Foreground viene gestito dall'omologa proprietà di un oggetto di esempio StyleManager. Questa nuova funzionalità ci permette, ad esempio, di modificare il valore della proprietà a runtime e di vedere quindi aggiornato il colore di Foreground a tutti gli oggetti che utilizzano il suddetto Style.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.