Ereditarietà del valore della proprietà

L'ereditarietà del valore della proprietà è una funzionalità del sistema di proprietà Windows Presentation Foundation (WPF). L'ereditarietà del valore della proprietà consente agli elementi figlio in un albero di elementi di ottenere il valore di una determinata proprietà dagli elementi padre, ereditando tale valore con le impostazioni specificate in un punto qualsiasi dell'elemento padre più vicino. Anche l'elemento padre potrebbe aver ottenuto il valore tramite l'ereditarietà del valore della proprietà, pertanto il sistema potrebbe procedere in modo ricorsivo fino alla radice della pagina. L'ereditarietà del valore della proprietà non è il comportamento predefinito del sistema di proprietà. È necessario stabilire una particolare impostazione dei metadati di una proprietà per fare in modo che quest'ultima attivi l'ereditarietà del valore per gli elementi figlio.

L'ereditarietà del valore della proprietà è un'ereditarietà di contenimento

Il termine "ereditarietà" usato in questa sede non coincide perfettamente con il concetto di ereditarietà nel contesto dei tipi e in generale della programmazione orientata a oggetti, in cui le classi derivate ereditano le definizioni dei membri dalle rispettive classi di base. Questo significato dell'ereditarietà è attivo anche in WPF: le proprietà definite in varie classi di base vengono esposte come attributi per le classi XAML derivate quando vengono usate come elementi ed esposte come membri per il codice. L'ereditarietà del valore della proprietà riguarda in particolare il modo in cui i valori delle proprietà possono ereditare da un elemento a un altro in base alle relazioni padre-figlio all'interno di un albero di elementi. L'albero degli elementi è più direttamente visibile quando annidare elementi all'interno di altri elementi durante la definizione delle applicazioni nel markup XAML. Gli alberi di oggetti possono essere creati anche a livello di codice, aggiungendo oggetti a raccolte designate di altri oggetti. In questo caso la modalità di funzionamento dell'ereditarietà del valore della proprietà sarà la stessa nell'albero completato in fase di esecuzione.

Applicazioni pratiche dell'ereditarietà del valore della proprietà

Le API WPF includono diverse proprietà con ereditarietà delle proprietà abilitata. In genere, lo scenario per queste proprietà prevede l'uso di una proprietà che possa essere impostata una sola volta per pagina, ma che sia anche un membro di una delle classi dell'elemento di base e quindi esista anche nella maggior parte degli elementi figlio. Ad esempio, la FlowDirection proprietà controlla la direzione in cui deve essere presentato e disposto il contenuto della direzione nella pagina. Nella maggior parte dei casi si preferisce che il concetto di flusso del testo sia gestito coerentemente in tutti gli elementi figlio. Se per qualche motivo la direzione del flusso è stata reimpostata in un livello dell'albero di elementi dall'utente o dall'ambiente, la reimpostazione deve essere in genere eseguita per tutta la struttura. Quando la FlowDirection proprietà viene creata per ereditare, il valore deve essere impostato o reimpostato una sola volta al livello dell'albero degli elementi che include le esigenze di presentazione di ogni pagina nell'applicazione. Anche il valore predefinito iniziale userà l'ereditarietà nello stesso modo. Il modello di ereditarietà del valore della proprietà consente in ogni caso ai singoli elementi di reimpostare il valore nelle rare occasioni in cui si sceglie intenzionalmente di usare una combinazione di direzioni di flusso.

Rendere ereditabile una proprietà personalizzata

Modificando i metadati di una proprietà personalizzata è possibile rendere ereditabili anche le proprietà di questo tipo. Si noti, tuttavia, che quando si definisce una proprietà come ereditabile è necessario fare alcune considerazioni sulle prestazioni. Nei casi in cui quella proprietà non dispone di un valore locale stabilito oppure di un valore ottenuto tramite stili, modelli o data binding, una proprietà ereditabile fornisce i relativi valori di proprietà assegnati a tutti gli elementi figlio dell'albero logico.

Per fare in modo che una proprietà partecipi all'ereditarietà del valore, creare una proprietà associata personalizzata, come descritto in Registrare una proprietà associata. Registrare la proprietà con i metadati (FrameworkPropertyMetadata) e specificare l'opzione "Eredita" nelle impostazioni delle opzioni all'interno di tali metadati. Verificare quindi che la proprietà abbia un valore predefinito stabilito, perché quel valore sarà ereditato. Anche se la proprietà è stata registrata come associata, può essere necessario creare un "wrapper" della proprietà per ottenere o impostare l'accesso sul tipo di proprietario, come si farebbe per una proprietà di dipendenza non associata. Dopo questa operazione, la proprietà ereditabile può essere impostata usando il wrapper di proprietà diretta sul tipo di proprietario o sui tipi derivati oppure può essere impostata usando la sintassi della proprietà associata in qualsiasi DependencyObjectoggetto .

Le proprietà associate sono concettualmente simili alle proprietà globali; è possibile verificare la presenza del valore in qualsiasi DependencyObject e ottenere un risultato valido. Lo scenario tipico per le proprietà associate consiste nell'impostare i valori delle proprietà sugli elementi figlio e tale scenario è più efficace se la proprietà in questione è una proprietà associata sempre presente in modo implicito come proprietà associata per ogni elemento (DependencyObject) nell'albero.

Nota

Anche se può sembrare che l'ereditarietà del valore della proprietà funzioni per le proprietà di dipendenza non associate, il comportamento di ereditarietà per una proprietà non associata tramite certi limiti di elementi nell'albero della fase di esecuzione non è definito. Usare RegisterAttached sempre per registrare le proprietà in cui si specificano Inherits i metadati.

Eredità dei valori di proprietà attraverso i limiti dell'albero

L'ereditarietà delle proprietà funziona mediante il passaggio attraverso un albero di elementi. Quest'albero spesso è parallelo all'albero logico. Tuttavia, ogni volta che si include un oggetto a livello di core WPF nel markup che definisce un albero degli elementi, ad esempio , Brushè stato creato un albero logico discontinuo. Un vero albero logico non si estende concettualmente attraverso , Brushperché l'albero logico è un concetto a livello di framework WPF. È possibile visualizzare questo risultato nei risultati quando si usano i metodi di LogicalTreeHelper. Tuttavia, l'ereditarietà del valore della proprietà può colmare questo divario nell'albero logico e può comunque passare i valori ereditati, purché la proprietà ereditabile sia stata registrata come proprietà associata e non venga rilevato alcun limite di blocco dell'ereditarietà intenzionale (ad esempio un ) Frame.

Vedi anche