ASP.Net  »  Guide  »  Guida Silverlight 

Dependency Property



Le Dependency Property, introdotte per permettere funzionalità avanzate direttamente dal linguaggio di markup, sono un altro tassello fondamentale di Silverlight, che consente di calcolare il valore di una proprietà in base al valore di altri input, per questo motivo vengono sfruttate dall'engine di presentazione per il data binding, le animazioni, gli stili e molto altro.

Si trata di normali proprietà di classi .NET, ma che hanno una particolare struttura che le rende fruibili da Silverlight in modo speciale; nessun linguaggio .NET a parte XAML le riconosce come tali.

Gli oggetti che ereditano direttamente dalla classe DependencyObject espongono la maggior parte delle proprietà come Dependecy Property, questo permette loro di supportare le animazioni. Ma per i tipi derivati dal FrameworkElement, queste proprietà supportanto anche il data binding e gli stili.

Identificare le Dependency Property è molto semplice dato che per convenzione, tutti i campi di questo tipo sono pubblici, statici e hanno il suffisso Property.

Poiché le Dependency Property sono campi statici, esse consumano una quantità di memoria molto inferiore rispetto alle tipiche proprietà .NET di cui esiste in memoria una copia per ogni istanza dell'oggetto che le espone, di fatto in Silverlight 2 la maggior parte delle proprietà esposte da un controllo sono Dependency Property.

Per implementare una Dependency Property all'interno di un elemento che eredita da DependencyObject o un oggetto derivato come per esempio FrameworkElement dobbiamo:

  1. definire un membro statico pubblico di tipo System.Windows.DependencyProperty
  2. registrare tale proprietà nel costruttore statico della classe attraverso una chiamata al metodo DependencyProperty.Register, anche esso statico, il quale richiede come parametri, il nome, il tipo della proprietà, il tipo della classe che la espone e il metodo di callback che viene invocato quando il valore della proprietà cambia
  3. esporre tale proprietà tramite la normale sintassi degli oggetti .NET (Property Wrapper) utilizzando internamente i metodi GetValue e SetVaule della classe base System.Windows.DependencyObject

Per esempio definiamo una proprietà IsFocused di tipo boolean per una classe DependencyPropertyDemo:

public class DependencyPropertyDemo : DependencyObject
{
  public static readonly DependencyProperty IsFocusedProperty;
  
  static DependencyPropertyDemo()
  {
    IsFocusedProperty = DependencyProperty.Register("IsFocused", typeof(bool), typeof(DependencyPropertyDemo), new PropertyMetadata(new PropertyChangedCallback(OnIsFocusedPropertyChanged)));
  }
  
  public bool IsFocused
  {
    get { return (bool)GetValue(IsFocusedProperty); }
    
    protected internal set { SetValue(IsFocusedProperty, value); }
  }
  
  private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    // qui va inserita l'eventuale logica applicativa
    // da eseguire quando il valore della proprietà è stato modoficato
  }
}

Essendo le Dependency Property delle proprietà statiche modificabili da diverse fonti e funzionalità (data binding, animazioni, stili, etc.), il Property System di Silverlight 2 prevede una gestione della priorità per decidere quale sarà l'effettivo valore finale di una Dependency Property.

Di seguito viene riportato l'ordine utilizzato dal Property System per l'assegnazione dei valori a runtime delle Dependency Property:

  1. Animazioni: Per ottenere qualsiasi effetto, l'animazione di una proprietà deve per forza essere in grado di avere la precedenza sul valore di base (iniziale), anche se quel valore è stato impostato localmente
  2. Valore locale: Un valore è impostato localmente quando viene valorizzata una proprietà tramite il wrapper CLR via codice procedurale, oppure tramite l'impostazione di attributo o Property Element via XAML
  3. Templated property: Valori provenienti da un ControlTemplate oppure un DataTemplate
  4. Style setters: Valori provenienti dai Setters di uno Style, sia esso locale, di pagina o di applicazione
  5. Valore predefinito: Il valore predefinito proveniente dalla definizione della Dependency Property

Ultimi articoli ASP.Net

LINQ e la trappola della 'deferred execution'

Una "trappola" in cui si può incappare utilizzando il risultato di...

C#, le Custom Type Conversion

Conversioni personalizzate tra classi, creare metodi particolari per...

Introduzione a Entity Framework

Il framework ORM messo a disposizione da .NET

Repeater: visualizzare un feed RSS

Utilizzare il controllo XMLDataSource e sfruttare il metodo XPath()...

Repeater, il server control "semplice"

Cos'è e come funziona il controllo Repeater

Altri articoli

Guide ASP.Net

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Guida Visual Studio 2010

L'ambiente di sviluppo di riferimento per sviluppare applicazioni su...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto