Panoramica delle proprietà associate

Una proprietà associata è un concetto XAML. Le proprietà associate consentono l'impostazione di coppie proprietà/valore aggiuntive su un oggetto, ma le proprietà non fanno parte della definizione dell'oggetto originale. Le proprietà associate sono in genere definite come un tipo specializzato di proprietà di dipendenza che non dispone della proprietà wrapper convenzionale nel modello di oggetto di tipo proprietario.

Prerequisiti

Si presuppone che l'utente comprenda il concetto di base delle proprietà di dipendenza e abbia letto Panoramica delle proprietà di dipendenza.

Proprietà associate in XAML

In XAML, è possibile impostare le proprietà associate usando la sintassi ProviderProprietàAssociata.PropertyName. Ecco un esempio di come impostare Canvas.Left in XAML.

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Nota

Si usa solo Canvas.Left come proprietà associata di esempio senza spiegare completamente il motivo per cui è possibile usarlo. Per maggiori informazioni su a che cosa serve Canvas.Left e su come Canvas gestisce i relativi elementi figli di layout, vedere l'argomento di riferimento Canvas o Definire layout con XAML.

Perché usare le proprietà associate?

Le proprietà associate sono un modo per eseguire l'escape delle convenzioni di codifica che potrebbero impedire a oggetti diversi in una relazione di comunicare informazioni tra loro in fase di esecuzione. È certamente possibile inserire proprietà su una classe base comune in modo che ogni oggetto possa semplicemente ottenere e impostare tale proprietà. Ma alla fine il numero più ampio di scenari in cui si potrebbe voler eseguire questa operazione porterà classi base con proprietà condivisibili. Potrebbe anche introdurre casi in cui potrebbero esserci solo due di centinaia di discendenti che tentano di usare una proprietà. Non è un buon design di classe. Per risolvere questo problema, il concetto di proprietà associata consente a un oggetto di assegnare un valore per una proprietà che non definisce la propria struttura di classe. La classe che definisce può leggere il valore dagli oggetti figlio in fase di esecuzione dopo la creazione dei vari oggetti in un albero di oggetti.

Ad esempio, gli elementi figlio possono usare proprietà associate per informare il relativo elemento padre di come devono essere presentati nell'interfaccia utente. Questo è il caso della proprietà associata Canvas.Left. Canvas.Left viene creato come proprietà associata perché è impostato su elementi contenuti all'interno di un elemento Canvas, anziché nell'oggetto Canvas stesso. Qualsiasi possibile elemento figlio usa quindi Canvas.Left e Canvas.Top per specificare l'offset di layout all'interno dell'elemento padre del contenitore di layout Canvas. Le proprietà associate consentono di funzionare senza includere il modello in oggetti dell'elemento base con numerose proprietà che ognuna si applica a uno dei numerosi contenitori di layout possibili. Molti dei contenitori di layout implementano invece il proprio set di proprietà associate.

Per implementare la proprietà associata, la classe Canvas definisce un campo statico DependencyProperty chiamato Canvas.LeftProperty. Pertanto, Canvas fornisce i metodi SetLeft e GetLeft come accessori pubblici per la proprietà associata, per abilitare sia l'impostazione XAML che l'accesso al valore di runtime. Per XAML e per il sistema di proprietà di dipendenza, questo set di API soddisfa un modello che abilita una sintassi XAML specifica per le proprietà associate e archivia il valore nell'archivio delle proprietà di dipendenza.

Come il tipo proprietario utilizza le proprietà associate

Anche se le proprietà associate possono essere impostate su qualsiasi elemento XAML (o su qualsiasi DependencyObjectsottostante), ciò non significa automaticamente che l'impostazione della proprietà produce un risultato tangibile o che il valore sia mai accessibile. Il tipo che definisce la proprietà associata si attiene di regola a uno di questi scenari:

  • Il tipo che definisce la proprietà associata è l'elemento padre in una relazione di altri oggetti. Gli oggetti figlio impostano i valori per la proprietà associata. Il tipo di proprietario della proprietà associata ha un comportamento innato che scorre i relativi elementi figlio, ottiene i valori e agisce su tali valori in un determinato punto della durata dell'oggetto (un'azione di layout, SizeChanged e così via)
  • Il tipo che definisce la proprietà associata viene usato come elemento figlio per un'ampia gamma di elementi padre e modelli di contenuto, ma le informazioni non sono informazioni sul layout necessarie.
  • La proprietà associata segnala informazioni a un servizio, non a un altro elemento dell'interfaccia utente.

Per maggiori informazioni su questi scenari e tipi di proprietà, vedere la sezione "Altre informazioni su Canvas.Left" di Proprietà associate personalizzate.

Proprietà associate in codice

Le proprietà associate non hanno i wrapper di proprietà tipici per ottenere e impostare facilmente l'accesso come altre proprietà di dipendenza. Ciò è dovuto al fatto che la proprietà associata non è necessariamente inclusa modello di oggetto incentrato sul codice per le istanze in cui la proprietà è impostata. È consentito, anche se non comune, definire una proprietà associata che sia una proprietà associata che altri tipi possono impostare su se stessi e che dispone anche di un utilizzo convenzionale delle proprietà nel tipo proprietario.

Esistono due modi per impostare una proprietà associata nel codice: usare le API del sistema delle proprietà o usare le funzioni di accesso del modello XAML. Queste tecniche sono praticamente equivalenti in termini di risultato finale, quindi quello da usare è principalmente una questione di stile di codifica.

Utilizzo del sistema di proprietà

Le proprietà associate per Windows Runtime vengono implementate come proprietà di dipendenza, in modo che i valori possano essere archiviati nell'archivio delle proprietà di dipendenza condiviso dal sistema di proprietà. Di conseguenza, le proprietà associate espongono un identificatore di proprietà di dipendenza nella classe proprietaria.

Per impostare una proprietà associata nel codice, chiamare il metodo SetValue e passare al campo DependencyProperty che funge da identificatore per la proprietà associata. (Si passa inoltre il valore a impostato).

Per ottenere il valore di una proprietà associata nel codice, chiamare il metodo GetValue passando di nuovo al campo DependencyProperty che serve come identificativo.

Uso del modello di funzione di accessorio XAML

Un processore XAML deve essere in grado di impostare i valori delle proprietà associate quando XAML viene analizzato in un albero di oggetti. Il tipo di proprietario della proprietà associata deve implementare metodi di accesso dedicati denominati nel formato GetPropertyName e SetPropertyName. Questi metodi della funzione di accesso dedicati sono anche unidirezionali per ottenere o impostare la proprietà associata nel codice. Dal punto di vista del codice, una proprietà associata è simile a un campo sottostante che dispone di funzioni di accesso ai metodi anziché di funzioni di accesso alle proprietà e tale campo sottostante può trovarsi in qualsiasi oggetto senza che doverlo definire in modo specifico.

L'esempio seguente illustra come impostare una proprietà associata nel codice tramite l'API della funzione di accesso XAML. In questo esempio c'è myCheckBox un'istanza della classe CheckBox. L'ultima riga è il codice che imposta effettivamente il valore; le righe prima di stabilire solo le istanze e la relazione padre-figlio. L'ultima riga non commentata è la sintassi se si usa il sistema di proprietà. L'ultima riga commentata è la sintassi se si usa il modello di funzione di accesso XAML.

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

Proprietà associate personalizzate

Per esempi di codice su come definire proprietà associate personalizzate e altre informazioni sugli scenari per l'uso di una proprietà associata, vedere Proprietà associate personalizzate.

Sintassi speciale per i riferimenti alle proprietà associate

Il punto in un nome di proprietà associata è una parte chiave del modello di identificazione. A volte ci sono ambiguità quando una sintassi o una situazione considera il punto come avente un altro significato. Ad esempio, un punto viene considerato come attraversamento del modello a oggetti per un percorso di associazione. Nella maggior parte dei casi che coinvolgono tale ambiguità, esiste una sintassi speciale per una proprietà associata che consente l'analisi del punto interno come separatore di proprietà proprietario. di una proprietà associata.

  • Per specificare una proprietà associata come parte di un percorso di destinazione per un'animazione, racchiudere il nome della proprietà associata tra parentesi ("()"), ad esempio "(Canvas.Left)". Per altre info, vedi Property-path syntax.

Avviso

Una limitazione esistente dell'implementazione XAML di Windows Runtime è che non è possibile animare una proprietà associata personalizzata.

  • Per specificare una proprietà associata come proprietà di destinazione per un riferimento di risorsa da un file di risorse a x:Uid, usare una sintassi speciale che inserisce una dichiarazione di tipo codice, completamente qualificata usando: dichiarazione all'interno di parentesi quadre ("[]"), per creare un'interruzione di ambito intenzionale. Ad esempio, supponendo che esista un elemento <TextBlock x:Uid="Title" />, la chiave di risorsa nel file di risorse destinata al valore Canvas.Top nell'istanza è "Title.[ using:Windows.UI.Xaml.Controls]Canvas.Top". Per altre info sui file di risorse e SU XAML, vedere Guida introduttiva: Traduzione delle risorse dell'interfaccia utente.