Serve una definizione breve e chiara per “Proprietà dipendenza”

Sto cercando di capire che cosa siano esattamente le proprietà di dipendenza, ma quando cerco ovunque una definizione, trovo solo “come usare” ma non “ciò che è”. Immagina che ti venga chiesto un colloquio di lavoro – che cos’è una proprietà di dipendenza. Quale sarebbe la tua risposta?

    Una proprietà DependencyProperty è una proprietà il cui valore dipende (o può dipendere) da un’altra fonte (ad esempio animazione, associazione dati, stili o eredità di alberi visivi). Il valore di una proprietà normale viene archiviato nell’object a cui appartiene, mentre è ansible pensare a una proprietà di dipendenza come archiviata in un database da qualche parte. Questo database è essenzialmente composto da un dizionario che associa (object, proprietà) le coppie ai loro valori, insieme a una mapping di quali proprietà dipendono da altre proprietà (ad esempio quando si modifica il DataContext di un Pannello, può avvisare tutti i bambini all’interno il pannello).

    Quindi, perché memorizzano valori di proprietà in qualche database magico da qualche parte? Ci sono alcuni motivi:

    • Riduce lo spazio di archiviazione. L’aggiunta di una proprietà (anche se il suo valore è null) a una class aggiunge 4 byte (8 per un processo a 64 bit) di spazio a ogni istanza della class. Una DependencyProperty occupa spazio solo quando un’istanza ha un valore. Ad esempio, un FrameworkElement ha dozzine di proprietà di dipendenza, molte delle quali non vengono mai assegnate ai valori. Se tutte queste proprietà fossero memorizzate nella class, ogni istanza sarebbe di centinaia di byte. Invece ogni istanza è solo di circa 40 byte.

    • Abilita le proprietà associate. Proprietà come Canvas.Left e Grid.Row devono essere memorizzate su oggetti che non hanno mai sentito parlare di un Canvas o Grid , quindi dove li metti? Li metti in un database da qualche parte.

    • Abilita le modifiche alle proprietà automatiche. Immagina come implementare qualcosa come gli stili o l’ereditarietà delle proprietà (la possibilità di impostare qualcosa come un font o un contesto di dati su un elemento genitore e avere il suo valore propagarsi a tutti gli elementi figli). Avere tutto questo memorizzato in un database fa sì che il codice sia tutto in un posto invece di essere implementato separatamente per ogni object e proprietà che ne ha bisogno.

    “offre un’infrastruttura per fare tutte le cose che spesso si desidera fare con una proprietà normale: convalidarla, forzarla in un intervallo adeguato, distribuire notifiche di modifica e una serie di altri aspetti”.

    Esercitazione su WPF – Introduzione alle proprietà di dipendenza

    Una proprietà di dipendenza è una proprietà che è supportata dal sistema di proprietà WPF invece che da un campo nella class dichiarante.

    Il significato di ciò è che, poiché WPF possiede la proprietà, WPF può tenere in considerazione varie considerazioni durante il calcolo del valore della proprietà, ad esempio animazioni, stili e associazioni di dati. Un’altra conseguenza è che poiché le proprietà sono gestite da WPF non devono essere dichiarate sulle classi che concettualmente hanno lo stato: quindi, proprietà atttached, che consentono ad esempio ad una griglia di associare lo stato specifico della griglia con oggetti non griglia.

    (A proposito, ho menzionato WPF sopra perché questo è il framework principale che utilizza i DP, ma anche Windows Workflow Foundation ha la nozione di proprietà di dipendenza. Quindi per essere rigorosamente corretti una DP è una proprietà che è supportata da una proprietà esterna sistema, in particolare uno che consente ai fattori diversi da “l’ultimo valore impostato” di entrare in gioco quando si ottiene il valore della proprietà.)

    Una proprietà di dipendenza è una proprietà in cui il valore corrente dipende (da cui il nome) su altri aspetti come valori predefiniti, convalida, coercizione, ereditarietà del valore o animazione.

    Inoltre, una proprietà di depedency ha un supporto integrato per le notifiche di modifica, l’associazione dei dati e lo stile.

    Quali sono?

    Un mucchio di classi e modi definiti di usarli che forniscono la funzionalità sopra descritta per essere utilizzati su classi che ereditano da DependencyObject.

    Non sono una funzionalità linguistica. Sono una funzionalità di .NET Framework.

    MSDN fornisce una buona definizione, descrizione ed esempi

    Per una comprensione più approfondita di DependencyProperty, controlla qui

    Una proprietà di dipendenza dipende da più provider per determinarne il valore in qualsiasi momento. Questi provider potrebbero essere un’animazione che cambia continuamente il suo valore, un elemento padre il cui valore di proprietà si propaga ai suoi figli e così via.

    Probabilmente la più grande caratteristica di una proprietà di dipendenza è la sua capacità integrata di fornire notifiche di modifica.

    Ogni volta che cambia il valore di una proprietà di dipendenza, WPF può triggersre automaticamente un numero di azioni, a seconda dei metadati della proprietà. Queste azioni possono essere re-rendering degli elementi appropriati, l’aggiornamento del layout corrente, l’aggiornamento dei binding di dati e molto altro. Una delle funzionalità più interessanti abilitate da questa notifica di modifica incorporata sono i trigger di proprietà, che consentono di eseguire le proprie azioni personalizzate quando un valore di proprietà cambia, senza scrivere alcun codice procedurale