Perché le DependencyProperties di .Net WPF devono essere membri statici della classe

StackOverflow https://stackoverflow.com/questions/36682

  •  09-06-2019
  •  | 
  •  

Domanda

Imparare WPF al giorno d'oggi.Ho trovato qualcosa di nuovo oggi con le proprietà di dipendenza .Net.Quello che portano in tavola lo è

  • Supporto per richiamate (convalida, modifica, ecc.)
  • Eredità della proprietà
  • Proprietà annesse

tra gli altri.

Ma la mia domanda qui è: perché devono essere dichiarati statici nella classe che li contiene?Il modo consigliato è quindi aggiungere la proprietà "wrapper" dell'istanza per loro.Perché ?

modificare:@Matt, ma ciò non impone anche che anche il valore della proprietà sia condiviso tra le istanze, a meno che ovviamente non si tratti di un valore derivato?

È stato utile?

Soluzione

Vedo 2 ragioni dietro tale requisito:

  1. Non è possibile registrare lo stesso DP due volte.Per rispettare questo vincolo dovresti usare la variabile statica, verrà inizializzata solo una volta quindi registrerai DP una sola volta.
  2. DP deve essere registrato prima della creazione di qualsiasi istanza di classe (che utilizza quel DB).

Altri suggerimenti

Le proprietà di dipendenza sono statiche a causa di un'ottimizzazione chiave in WPF:Molti controlli in WPF hanno decine, se non centinaia di proprietà.La maggior parte delle proprietà di queste classi sono impostate sul valore predefinito.Se i DP fossero proprietà di istanza, sarebbe necessario allocare memoria per ogni proprietà in ogni oggetto creato.Poiché i DP sono statici, WPF è libero di gestire l'utilizzo della memoria di ciascuna proprietà in modo più efficace.

Il motivo per cui dovresti fornire un valore predefinito per qualsiasi DP registrato è perché WPF si prenderà cura di non allocare memoria aggiuntiva per la tua proprietà quando è impostata sul suo valore predefinito, indipendentemente dal numero di oggetti che contengono quella proprietà che crei.

Penso che il motivo per cui hai bisogno dell'istanza statica di una proprietà di dipendenza è in realtà solo perché è così che sono stati progettati.Il bit statico contiene tutti i metadati della proprietà: il suo valore predefinito, il tipo di proprietario (utile se è una proprietà collegata) ecc., i suoi metodi di callback per quando cambia - quel genere di cose.Ha senso archiviare queste cose staticamente in tutte le istanze della classe anziché per istanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top