2010-11-05 17 views
14

A volte penso che forse si utilizzino le proprietà di dipendenza inutilmente. Quando devo usarlo? Quando ho una proprietà che dipende da altre proprietà? Dire che ho una proprietà Color che voglio che dipenda dalle proprietà Tonalità, Saturazione, Luminosità, utilizzo una proprietà di dipendenza? O cosa uso? Controllo questo limite associato a Color da aggiornare quando le proprietà Tonalità, Saturazione, Luminosità vengono modificate.Quando utilizzare le proprietà delle dipendenze

per ora quello che ho fatto è stato

public byte Hue { 
    get { return _hue; } 
    set 
    { 
     if (_hue == value) 
      return; 
     _hue = value; 
     NotifyPropertyChanged("Hue"); 
     NotifyPropertyChanged("Color"); // to update controls bound to color 
    } 
} 

ma credo che questo non è il modo giusto di fare le cose? Se ho più proprietà che influenzano il colore, avrò 1 riga in più in tutte queste proprietà?

+1

Non penso che sia un sovraccarico irragionevole in termini di codice, ed è sicuramente più leggero rispetto all'aggiunta di una proprietà Dependency. –

+0

se si sta utilizzando la rotta hsl-color. È necessario calcolare così spesso, ad esempio, salvare sempre H, S e L e convertirli solo quando è necessario sincronizzarli, il che aumenterà enormemente la velocità. –

risposta

21

Utilizzare solo un DependencyProperty quando si desidera poter associare il valore al valore a qualcosa tramite XAML, ad es.

<local:MyObject MyDependencyProperty="{Binding ...}" /> 

Aggiornamento: come detto da Ian di seguito, le proprietà di dipendenza sono necessari anche se si vuole essere in grado di animare la vostra proprietà o impostarlo attraverso uno stile

Se non c'è bisogno di lavorare in questo modo quindi non è necessario. per esempio. Se si desidera solo essere in grado di impostare il valore a una costante attraverso XAML (come sotto) questo lavoro senza utilizzare una DependencyProperty

<local:MyObject MyRegularProperty="Some Value" /> 

Allo stesso modo, se si desidera associare - il valore di una proprietà su (per esempio) il vostro vista del modello:

<TextBlock Text="{Binding MyViewModelProperty}" /> 

allora non c'è bisogno di usare un DependencyProperty. Se si implementa INotifyPropertyChanged, lo Text verrà comunque aggiornato quando la proprietà cambia.

Edit: rileggendo la tua domanda, non sono sicuro se la vostra situazione sarà influenzato da se o non si utilizza un DependencyProperty - se sto leggendo correttamente, tutto quello che vuoi fare è causare un numero di proprietà da aggiornare sull'interfaccia utente quando cambia una di queste proprietà, giusto?

Non penso che ci sia qualcosa di sbagliato nel modo in cui stai implementando le cose al momento (cioè sollevando un sacco di eventi PropertyChanged in ogni setter), ma se non ti appassioni allora potresti provare ad avere un singola proprietà che espone importanti proprietà secondarie di legarsi a che sono tutti calcolati:

class ColorWrapper 
{ 
    public Color Color { get; set; } 
    public byte Hue 
    { 
     get { return this.Color.Hue; } //or however this is calculated 
} 

Poi hanno una proprietà Color sul tuo ViewModel che genera l'evento PropertyChanged e legarsi a che attraverso la vista:

<TextBlock Text="{Binding Color.Hue}" /> 

Come ho detto, non direi che questo è un miglioramento in particolare di quello che hai già.

+0

Il binding non è attivo usare il caso. Se l'oggetto che implementa la proprietà è un elemento dell'interfaccia utente (e alcune persone implementano i DP su oggetti non dell'interfaccia utente), il sistema DP abilita varie altre funzionalità, tra cui animazione, stili e (solo WPF - Silverlight non dispone di questi) trigger. Inoltre, i DP sono utili se la proprietà viene spesso lasciata al suo valore predefinito, poiché ogni istanza utilizza solo lo spazio per i DP che sono stati impostati. –

+0

@Ian Griffiths, buon punto dell'animazione e dello stile - risposta aggiornata. Suppongo che il tuo commento sui valori predefiniti sia valido, ma dato il sovraccarico implicato nell'implementazione e nell'uso di una proprietà di dipendenza su una proprietà plain (in particolare se non stai già lavorando su un 'DependencyObject') in genere non scenderò in quella direzione. –

+4

La funzione del valore predefinito ha un impatto non banale sulle prestazioni di WPF. Salva qualche centinaio di byte per oggetto e, se il tuo albero visivo contiene qualche migliaio di oggetti, sono diverse centinaia di KB. Una piccola frazione della memoria complessiva, ma abbastanza per un impatto enorme sull'utilizzo efficiente della cache della CPU (specialmente durante il layout). Tuttavia, è probabile che sia irrilevante per qualsiasi oggetto non dell'interfaccia utente e probabilmente non è di grande aiuto per gli elementi dell'interfaccia utente personalizzati, in cui è molto probabile che imposti le proprietà CUSOM che definisci. Quindi sono d'accordo ... Volevo solo illustrare che i DP servono a diversi scopi. –

15

Le regole generali sono:

  • Per controlli XAML, proprietà di dipendenza uso;

  • Per i dati (che vengono associati all'interfaccia), utilizzare INotifyPropertyChanged.

Ci sono delle eccezioni, ma sono rare.

0

Ricordare che Proprietà dipendenza, anche se consentono Binding come origine o destinazione, sono anche sensibili al thread e quando si serializza si dovrà utilizzare un surrogato, serializzazione come DependencyObject non serializzabile.

Oh, e Equals e GetHashCode sono sigillati :(

2

Un altro uso della proprietà di dipendenza è con il giornale di navigazione. Proprietà di dipendenza personalizzate su una pagina con la bandiera Ÿ rivista nella meta-dati sono inclusi nello stato che WPF salva per la pagina

Problemi correlati