Ci sono due concetti qui: proprietà di dipendenza e proprietà di dipendenza allegate. Le "Proprietà associate" sono proprietà di dipendenza e, come tale, dipendono dal supporto property value inheritance.
Informazioni sulle proprietà di dipendenza di base, una dichiarazione molto approssimativa sarebbe che esse ereditano fondamentalmente i loro valori dagli elementi padre nell'albero wpf (logico/visivo). Una proprietà di dipendenza (associata o meno) eredita il suo valore "al ribasso" se il suo metadata è impostato con FrameworkPropertyMetadataOptions. Inherit flag, e in molti casi è così.
proprietà associate sono proprietà che possono essere impostate su qualsiasi oggetto wpf (sostanzialmente, almeno DependencyObject) tramite il metodo DependencyObject.SetValue. Lo scopo di questo meccanismo è di "collegare" ad altri oggetti le informazioni necessarie agli oggetti padre, non gli oggetti figli stessi. Ad esempio, Grid.Row è una proprietà associata richiesta dalla griglia per posizionare gli elementi all'interno dell'area di rendering.
Le proprietà di dipendenza vengono automaticamente "ridotte" automaticamente dal sistema di oggetti wpf.
Le proprietà collegate vengono esaminate "verso l'alto" in modo esplicito, nel codice di oggetti specifici. Nel caso di Grid, al momento di determinare dove posizionare gli elementi, controlla il valore delle proprietà associate a Grid.Row e Grid.Column su ciascun oggetto contenuto.
Spesso è anche la tecnica per creare proprietà associate personalizzate che modificano in qualche modo gli oggetti a cui sono collegate (ad esempio, lo Drag'n'Drop functionality via attached properties).
Come nota aggiuntiva, un buon esempio di proprietà associata ereditata è TextElement.FontFamily. Le proprietà Grid.Row e Grid.Column non hanno il flag Inherits.
TextElement.FontFamily, dal riflettore:
FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));
Grid.Row, dal riflettore:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
Interessante e informativo. Che dire di questo scenario, però: Una griglia 2x2 (A) contiene una griglia 2x2 (B). La griglia B contiene un pulsante. Se Grid B ha la griglia.La proprietà Column Attached impostata su 1 (quindi appare nella seconda colonna della sua griglia padre, Grid A), non dovrebbe che la Proprietà associata si sovrapponga al pulsante Grid B, quindi il pulsante appare nella seconda colonna di Grid B? – Pwninstein
Buona domanda, aggiunta di informazioni alla risposta. –
Fantastico! Ha molto più senso ora, grazie !! – Pwninstein