2013-09-03 9 views
20

Quando devo usare le proprietà di dipendenza in WPF?Quando dovrei usare le proprietà di dipendenza in WPF?

Sono statici, quindi risparmiamo molto sulla memoria, rispetto all'uso delle proprietà .NET. Altri utili di utilizzare le proprietà di dipendenza sulle proprietà .NET sono: 1) non c'è bisogno di controllare l'accesso discussione 2) chiede conferma un elemento contenente da rendere ecc ...

Così sembra che devono sempre utilizzare le proprietà di dipendenza nei miei progetti in cui utilizzo WPF?

Forse per alcune proprietà banali delle classi helper qua e là ho potuto farla franca con proprietà .NET ...

+0

http://stackoverflow.com/questions/5193144/what-is-a-dipendency-property-and-when-is-it-used, http://stackoverflow.com/questions/617312/what-is -a-dependency-property – Nitesh

+0

Una cosa importante è che le proprietà di dipendenza possono essere utilizzate solo sugli oggetti ereditati da DependencyObject. Uno dei motivi per non usarli su ViewModels e quindi non sempre in un progetto WPF. Inoltre hanno un piccolo impatto sulle prestazioni. – dowhilefor

+0

Non sono sicuro del motivo per cui si dice "non è necessario controllare l'accesso al thread" ?. Per quanto ne so, se si imposta il valore di una proprietà di dipendenza da un altro thread rispetto al thread dell'interfaccia utente, verrà generata un'eccezione. –

risposta

16

Dependency Property è un concetto ampio che spiega quali potrebbero essere necessarie due pagine per scrivere. Quindi, solo per rispondere alla tua domanda. proprietà di dipendenza è usato dove

  1. Sai la proprietà sta per essere l'obiettivo vincolante cioè il vostro stanno creando il controllo utente di controllo/personalizzato e si vuole proprietà che dovrebbe essere vincolante guidato.

  2. Si desidera che le notifiche di modifica delle proprietà automatiche (coincidenza e convalida anche).

  3. Vogliamo l'ereditarietà del valore in stili, temi, valore padre o predefinito.

  4. Non è necessario creare le proprietà sul livello Model o ViewModel come proprietà di dipendenza la maggior parte delle volte poiché ciò non aiuterà molto sulla memoria, poiché la maggior parte delle proprietà definite nel modello/VM avranno valori per istanza poiché cambieranno costantemente. La risoluzione del valore della proprietà di dipendenza è un fardello di per sé, quindi non è consigliabile rendere la dipendenza della proprietà inutilmente.

Grazie

+0

Sì, gli stili e le animazioni sono un contesto in cui è necessario utilizzare le proprietà di dipendenza. – user2381422

+0

deve essere utilizzato anche quando si desidera essere in grado di associare il proprio valore tramite XAML. –

5

La differenza principale è che il valore di una normale proprietà .NET viene letta direttamente da un membro privato della classe, mentre il valore di DependencyProperty viene risolto dinamicamente quando si chiama il metodo GetValue() ereditato da DependencyObject.

Quando si imposta un valore di una proprietà di dipendenza non viene memorizzato in un campo dell'oggetto, ma in un dizionario di chiavi e valori fornito dalla classe di base DependencyObject. La chiave di una voce è il nome della proprietà e il valore è il valore che si desidera impostare.

I vantaggi di proprietà di dipendenza sono

  1. ridotto ingombro di memoria:
    E 'un enorme dissipazione per memorizzare un campo per ogni proprietà, quando si pensa che oltre il 90% delle proprietà di un controllo dell'interfaccia utente in genere soggiornare i suoi valori iniziali. Le proprietà di dipendenza risolvono questi problemi solo memorizzando le proprietà modificate nell'istanza. I valori predefiniti vengono memorizzati una volta all'interno della proprietà di dipendenza.
  2. Valore ereditario:
    Quando si accede a una proprietà di dipendenza, il valore viene risolto utilizzando una strategia di risoluzione del valore. Se non è impostato alcun valore locale, la proprietà di dipendenza naviga fino all'albero logico finché non trova un valore. Quando si imposta FontSize sull'elemento radice, questo si applica a tutti i blocchi di testo sottostanti, tranne che si sostituisce il valore.
  3. Notifica di modifica:
    Le proprietà di dipendenza hanno un meccanismo di notifica delle modifiche incorporato. Registrando una richiamata nei metadati della proprietà si ottiene una notifica, quando il valore della proprietà è stato modificato. Questo è anche usato dal database.

controllo l'URL di seguito per maggiori dettagli circa la magia behid si

dependency properties in WPF

+10

Hai praticamente copiato qui la documentazione di msdn senza dare un commento utile. Sì, tutte queste cose sono buone, ma qual è il tuo suggerimento, per usare sempre le proprietà di dipendenza? – user2381422

1

proprietà di dipendenza vengono utilizzati quando si desidera l'associazione dati in un UserControl, ed è il metodo standard di associazione dati per la Controlli di WPF Framework. I DP hanno slightly better binding performance e tutto è fornito all'utente all'interno di un UserControl per implementarli.

In caso contrario, si utilizza in genere INotifyPropertyChanged per il collegamento altrove, poiché è più semplice da implementare in classi autonome e ha un sovraccarico minore. Per quanto riguarda le ipotesi iniziali:

  1. C'è un'istanza locale della variabile, sicuramente non si salva alcun overhead su una proprietà poiché è presente una significativa logica di binding di dati incorporata.
  2. They must be accessed on the main thread.
+0

Questo non è corretto, almeno non è preciso. Sì, le proprietà di dipendenza possono essere utilizzate su UserControls ma anche su CustomControls e sostanzialmente su ogni oggetto derivato da DependencyObject. – dowhilefor

11

Il motivo principale per creare DependencyProperty è quando si scrive si possiede il controllo WPF. DependencyProperties può essere utilizzato come sorgente e destinazione vincolante e può essere animato. Le proprietà di tutti i controlli del framework sono implementate come DependencyProperty, motivo per cui è possibile eseguire potenti associazioni di dati in XAML.

Tuttavia, nella maggior parte dei casi, come in MVVM, non sono necessarie le proprietà di dipendenza, è sufficiente il numero INotifyPropertyChanged.

1

Forse dovresti dare un'altra occhiata alla pagina Dependency Properties Overview su MSDN.

Personalmente, creerei sempre uno DependencyProperty quando ho veramente su. Per la maggior parte, utilizzo le normali proprietà CLR nel tipo di dati e visualizzo le classi del modello da associare a ... questo è assolutamente soddisfacente, purché implementi l'interfaccia INotifyPropertyChanged.

Quindi per tutti i miei soliti binding di dati, utilizzo le normali proprietà CLR. I solo dichiarare un Dependency Property per fornire alcune funzionalità aggiuntive in un UserControl.

4

enter image description here

CLR Proprietà vs. proprietà di dipendenza

proprietà A CLR legge direttamente da parte del membro privato della classe. I metodi Get() e Set() della classe recuperano e memorizzano i valori della proprietà. Mentre invece si imposta un valore di una proprietà dipendenza non viene memorizzato in un campo dell'oggetto, ma in un dizionario di chiavi e valori fornito dalla classe di base DependencyObject. La chiave di una voce è il nome della proprietà e il valore è il valore che si desidera impostare.

vantaggi di una proprietà di dipendenza Meno consumo di memoria

La proprietà di dipendenza memorizza struttura solo quando è alterato o modificato. Quindi un'enorme quantità di memoria per i campi è gratuita.

valore dell'immobile eredità Ciò significa che se nessun valore è impostato per la proprietà allora tornerà l'albero di ereditarietà fino a dove si ottiene il valore.

notifica di modifica e Data Bindings Ogni volta che una proprietà cambia il suo valore che fornisce la notifica nella proprietà di dipendenza utilizzando INotifyPropertyChange e aiuta anche in associazione dati.

La partecipazione di animazione, stili e modelli una dipendenza Proprietà può animare, impostare gli stili utilizzando setter di stile e anche fornire modelli per il controllo.

CallBacks Ogni volta che una proprietà viene modificata, è possibile richiamare una richiamata.

Risorse È possibile definire una risorsa per la definizione di una proprietà di dipendenza in XAML.

Override metadati È possibile definire determinati comportamenti di una proprietà di dipendenza utilizzando PropertyMetaData. Pertanto, la sovrascrittura di metadati da una proprietà derivata non richiede la ridefinizione o la reimplementazione dell'intera definizione di proprietà.

Problemi correlati