Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 15 di 59
  • livello principiante
Indice lezioni

Dependency Property

Definire comportamenti e funzionalità avanzate direttamanete dal markup
Definire comportamenti e funzionalità avanzate direttamanete dal markup
Link copiato negli appunti

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

Ti consigliamo anche