Condividi tramite


Proprietà di dipendenza

Nota

Questo contenuto viene ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms and Patterns for Reusable .NET Libraries, 2nd Edition. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.

Una proprietà di dipendenza (DP) è una proprietà regolare che archivia il relativo valore in un archivio proprietà anziché archiviarlo in una variabile di tipo (campo), ad esempio.

Una proprietà di dipendenza associata è un tipo di proprietà di dipendenza modellata come metodi Get e Set statici che rappresentano "proprietà" che descrivono le relazioni tra gli oggetti e i relativi contenitori, ad esempio la posizione di un oggetto Button in un contenitore Panel.

✔️ Specificare le proprietà di dipendenza, se sono necessarie le proprietà per supportare funzionalità WPF, ad esempio stili, trigger, data binding, animazioni, risorse dinamiche ed ereditarietà.

Progettazione delle proprietà di dipendenza

✔️ EREDITARE da DependencyObject, o da uno dei relativi sottotipi, durante l'implementazione delle proprietà di dipendenza. Il tipo fornisce un'implementazione molto efficiente di un archivio proprietà e supporta automaticamente il data binding WPF.

✔️ FORNIRE una normale proprietà CLR e un campo pubblico di sola lettura statico che archivia un'istanza di System.Windows.DependencyProperty per ogni proprietà di dipendenza.

✔️ IMPLEMENTARE le proprietà di dipendenza chiamando i metodi di istanza DependencyObject.GetValue e DependencyObject.SetValue.

✔️ DENOMINARE il campo statico della proprietà di dipendenza usando il suffisso del nome della proprietà con "Property".

❌ NON impostare i valori predefiniti delle proprietà di dipendenza in modo esplicito nel codice; impostarli invece nei metadati.

Se si imposta un valore predefinito di una proprietà in modo esplicito, è possibile impedire che tale proprietà venga impostata in modo implicito, ad esempio uno stile.

❌ NON inserire il codice nelle funzioni di accesso alle proprietà diverse dal codice standard per accedere al campo statico.

Tale codice non verrà eseguito se la proprietà viene impostata in modo implicito, ad esempio uno stile, perché lo stile usa direttamente il campo statico.

❌ NON usare le proprietà di dipendenza per archiviare dati sicuri. È possibile accedere pubblicamente anche alle proprietà di dipendenza private.

Progettazione di proprietà di dipendenza associata

Le proprietà di dipendenza descritte nella sezione precedente rappresentano proprietà intrinseche del tipo dichiarante; Ad esempio, la proprietà Text è una proprietà di TextButton, che la dichiara. Un tipo speciale di proprietà di dipendenza è la proprietà di dipendenza associata.

Un esempio classico di una proprietà associata è la proprietà Grid.Column. La proprietà rappresenta la posizione della colonna Pulsante (non griglia), ma è rilevante solo se il pulsante è contenuto in una griglia e quindi è "collegato" ai pulsanti in base alle griglie.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0">Click</Button>
    <Button Grid.Column="1">Clack</Button>
</Grid>

La definizione di una proprietà associata è principalmente simile a quella di una normale proprietà di dipendenza, tranne che per il fatto che le funzioni di accesso sono rappresentate dai metodi Get e Set statici:

public class Grid {

    public static int GetColumn(DependencyObject obj) {
        return (int)obj.GetValue(ColumnProperty);
    }

    public static void SetColumn(DependencyObject obj, int value) {
        obj.SetValue(ColumnProperty,value);
    }

    public static readonly DependencyProperty ColumnProperty =
        DependencyProperty.RegisterAttached(
            "Column",
            typeof(int),
            typeof(Grid)
    );
}

Convalida delle proprietà di dipendenza

Le proprietà spesso implementano ciò che viene definito convalida. La logica di convalida viene eseguita quando viene effettuato un tentativo di modificare il valore di una proprietà.

Sfortunatamente, le funzioni di accesso alle proprietà di dipendenza non possono contenere codice di convalida arbitrario. È invece necessario specificare la logica di convalida delle proprietà di dipendenza durante la registrazione delle proprietà.

❌ NON inserire la logica di convalida delle proprietà di dipendenza nelle funzioni di accesso della proprietà. Passare invece un callback di convalida al metodo DependencyProperty.Register.

Notifiche di modifica delle proprietà di dipendenza

❌ NON implementare la logica di notifica delle modifiche nelle funzioni di accesso alle proprietà di dipendenza. Le proprietà di dipendenza dispongono di una funzionalità predefinita per le notifiche di modifica che deve essere usata fornendo un callback di notifica delle modifiche a PropertyMetadata.

Coercizione del valore della proprietà di dipendenza

La coercizione della proprietà viene eseguita quando il valore assegnato a un setter di proprietà viene modificato dal setter prima che l'archivio proprietà venga effettivamente modificato.

❌ NON implementare la logica di coercizione nelle funzioni di accesso alle proprietà di dipendenza.

Le proprietà di dipendenza hanno una funzionalità di coercizione predefinita e può essere usata fornendo un callback di coercizione a PropertyMetadata.

Parti protette da copyright © 2005, 2009 Microsoft Corporation. Tutti i diritti sono riservati.

Ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2a edizione di Krzysztof Cwalina and Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional nella collana Microsoft Windows Development Series.

Vedi anche