testa
 
 
 
Internet WPF Dependency Properties
cornice di chiusura
 
Articolo orginale
Quando is lavora con WPF sarai sicuramente incappato nel termine Dependency Property, e ti sei mai chiesto cosa sia e come possa essere legato alla proprietà fornita dal CRL? Qui cercerò di spiegare questo. Cerchiamo quindi di capire questa fantastica caratteristica di WPF, ma prima di ciò spero tu sia abbastanza a conoscenza di alcuni concetti base di CLR, programmazione ad oggetti (Object-Oriented Programming) ed abbia almeno sviluppato una semplice applicazione WPF.

Dependency Property; cosa sono?

WPF viene fornito con alcuni servizi che estendono le proprietà CLR che vengono comunemente chiamate Dependency Properties. Una DP è una proprietà il cui valore dipende da sorgenti esterne, come animazioni, associazione dati (data binding), stili, o ereditarietà dell'albero visivo (visual tree inheritance). Non solo questo, ma una DP ha al suo interno anche la caratteristica di fornire una notifica quando la proprietà è cambiata, l'associazione dati è cambiata o lo stile è cambiato. Proprietà CLR Property vs. Dependency Property

Una proprietà CLR legge direttamente dal membro privato della classe, i metodi Get() e Set() della classe recuperano ed archiviano i valori della proprietà.
Mentre quando si setta un valore di una DependencyProperty non viene archiviato in un campo dell'oggeto, ma in un Dictionary di chiavi/valori fornito dalla classe base DependencyObject. La chiave di una entry è il medesimo nome della proprietà ed il valore è il valore che si vuole settare.


Vantaggi di una Dependency Property

  • Meno consumo di memoria

    La Dependency Property archivia la proprietà solo quando viene modificata o alterata. Pertanto una grande quantità di memoria per i campi rimane libera.

  • Ereditarietà del valore di Proprietà

    Questo significa che se non viene impostato nessun valore per la proprietà, si risale l'albero dell'ereditarietà fino ad ottenere il valore.

  • Notifica dei cambiamenti ed Associazione Dati (Data Bindings)

    Quando una proprietà modifica il suo valore solleva una notifica alla Dependency Property utilizzando INotifyPropertyChange ed inoltre aiuta il Data Binding.

  • Partecipazione alle animazioni, stili e templates

    Una DP è in grado di animare, impostare stili utilizzando style setters ed inoltre fornire template per i controlli.

  • CallBacks

    Nel momento in cui una proprietà viene modificata, viene sollevato una callback.

  • Risorse

    E' possibile definire una Risorsa per la definizione di una DP in XAML.

  • Overriding Metadata

    E' possibile definire alcuni behaviours/comportamenti delle DP utilizzando PropertyMetaData. Così, sovrascrivendo un metadata da una proprietà derivata non richiederà di ridefinire o ri-implementare l'intera definizione della proprietà.

Esempio

Per lavorare con una DP, si deve derivare dalla classe DependencyObject, come l'osservatore che include la nuova Property System è definito all'interno del DependencyObject. Realizziamo una semplice applicazione per la selezione di macchine.

XAML

< Window  x : Class ="WpfApplication1.DependencyPropertyDemo"

         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"

         xmlns : local ="clr-namespace:WpfApplication1"

         Title ="DependencyPropertyDemo"  Height ="150"  Width ="250">

< Window.Resources >

     < local : DependencyPropertySample  x : Key ="CarDependency" />

</ Window.Resources >

< Grid >

     < Grid.RowDefinitions >

         < RowDefinition  />

         < RowDefinition  />

     </ Grid.RowDefinitions >

     < Label  Content ="Enter Car:"  Grid.Row ="0"

            VerticalAlignment ="Center" />

     < TextBox  Text ="{ Binding  Path =MyCar,  

                            Source ={ StaticResource   CarDependency }}"

              Name ="MyTextCar"  Height ="25"  Width ="150"  

             HorizontalAlignment ="Right" />

     < Button  Name ="MyButton"  Content ="Click Me!"

             Click ="MyButton_Click"  Height ="25"  

            Width ="150"  Grid.Row ="1" />

</ Grid >

</ Window >


Code Behind

public class CarDependencyProperty : DependencyObject
{
    //Register Dependency Property
    public static readonly DependencyProperty CarDependency = DependencyProperty.Register("MyProperty", typeof(string), typeof(DependencyPropertySample));

    public string MyCar
    {
        get
        {
            return (string)GetValue(CarDependency);
        }
        set
        {
            SetValue(CarDependency, value);
        }
    }
}

public partial class CarDependencyPropertyDemo : Window
{
    public CarDependencyPropertyDemo()
    {
        InitializeComponent();
    }
    private void MyButton_Click(object sender, RoutedEventArgs e)
    {
        CarDependency dpSample =
        TryFindResource("CarDependency ") as CarDependency;
        MessageBox.Show(dpSample.MyCar);
    }
}

 
 
 
 
I23 di Boccaletti Emanuele
 
I23 di Boccaletti Emanuele
41121 Modena (MO)
Tel. +39 347 1302420
emanuele@i23.eu
Skype: emanuele.boccaletti
 
 
Copyright © I23 di Boccaletti Emanuele - emanuele@i23.eu