2015-05-21 12 views
8

vidi un esempio in cui c'erano 2 proprietà di dipendenza:Qual è la necessità di forzare una proprietà dipendenze?

public static readonly DependencyProperty CurrentReadingProperty = 
    DependencyProperty.Register("CurrentReading", 
    typeof(double), 
    typeof(Gauge), 
    new FrameworkPropertyMetadata(Double.NaN, 
     FrameworkPropertyMetadataOptions.None, 
     new PropertyChangedCallback(OnCurrentReadingChanged), 
     new CoerceValueCallback(CoerceCurrentReading) 
    ), 
    new ValidateValueCallback(IsValidReading) 
); 

e

public static readonly DependencyProperty MinReadingProperty = 
    DependencyProperty.Register(
    "MinReading", 
    typeof(double), 
    typeof(Gauge), 
    new FrameworkPropertyMetadata(
     double.NaN, 
     FrameworkPropertyMetadataOptions.None, 
     new PropertyChangedCallback(OnMinReadingChanged), 
     new CoerceValueCallback(CoerceMinReading) 
    ), 
    new ValidateValueCallback(IsValidReading)); 

in OnCurrentReadingChanged Eseguo seguenti operazioni d.CoerceValue(MinReadingProperty);

che richiama CoerceValueCallback delegato ("CoerceMinReading") che ha il seguente codice:

private static object CoerceMinReading(DependencyObject d, object value) 
{ 
    Gauge g = (Gauge)d; 
    double min = (double)value; 
    // some required conditions; 
    return min; 
} 

Quello che voglio capire è, perché devo eseguire la coercizione?

Perché non posso semplicemente chiamare SetValue all'interno della mia proprietà modificato callback e modificare le proprietà richieste invece di chiamare CoerceValue e gestire le cose nel mio callback coattivo?

+2

Non dovresti mai farlo. Non è chiaro il motivo per cui pensi di aver bisogno di farlo ... – Will

risposta

9

Coercion è progettato per (facoltativamente) assicurarsi che un valore sia valido in situazioni in cui è giusto che lo strato dell'interfaccia utente prenda tali decisioni. Un esempio classico è una sorta di controllo a scorrimento in cui una proprietà associata sta tentando di impostare il valore fuori dall'intervallo specificato del cursore. In questo caso è accettabile "clampare" il valore ito è minimo o massimo piuttosto che lanciare eccezioni di validazione.

La chiamata di SetValue durante una modifica di proprietà SetValue non è efficiente perché si sta potenzialmente allagando il sistema con eventi ricorsivi. Questo è il motivo per cui esiste la coercizione. Basta ricordare i suoi limiti e usarlo dove appropriato. In questo caso è appropriato.

+0

_In questo caso è appropriato_ - ma non in OnCurrentReadingChanged, che merita un po 'di enfasi. –

+0

@HenkHolterman Puoi spiegarlo. A prima vista, questo caso corrisponde agli esempi [qui] (https://msdn.microsoft.com/en-us/library/ms745795 (v = vs.110) .aspx) e [qui] (http://drwpf.com/blog/2010/05/05/value-coercion-for-the-masses/) –