2015-05-21 6 views
8

że nastąpił przykład, w którym były 2 Właściwości zależnościąJaka jest potrzeba wymuszania właściwości zależności?

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) 
); 

i

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)); 

i OnCurrentReadingChanged mogę wykonywać następujące operacje d.CoerceValue(MinReadingProperty);

który wywołuje CoerceValueCallback pełnomocnik ("CoerceMinReading") który ma następujący kod:

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

Co chcę zrozumieć, dlaczego muszę wykonać przymus?

Dlaczego po prostu nie mogę połączyć się z SetValue wewnątrz mojej usługi, zmieniłem oddzwonienie i zmieniłem wymagane właściwości, zamiast dzwonić do CoerceValue i obsługiwać rzeczy w moim wywołaniu wywołania coerce?

+2

Nigdy nie powinieneś tego robić. Nie jest również jasne, dlaczego uważasz, że musisz to zrobić ... – Will

Odpowiedz

9

Przymus został zaprojektowany tak, aby (opcjonalnie) upewnić się, że wartość jest ważna w sytuacjach, w których podejmowanie takich decyzji jest w porządku dla warstwy interfejsu użytkownika. Klasycznym przykładem jest pewien rodzaj suwaka, w którym właściwość bound próbuje ustawić wartość z określonego zakresu suwaka. W tym przypadku dopuszczalne jest "zaciśnięcie" wartości ito jako minimum lub maksimum zamiast odrzucania wyjątków walidacyjnych.

Wywoływanie wartości SetValue podczas zmiany właściwości SetValue nie jest wydajne, ponieważ potencjalnie zalewamy system zdarzeniami rekurencyjnymi. Właśnie dlatego istnieje przymus. Po prostu pamiętaj o jego ograniczeniach i używaj go w razie potrzeby. W takim przypadku jest to właściwe.

+0

_W tym przypadku jest to odpowiednie_ - ale nie w OnCurrentReadingChanged, które zasługuje na nacisk. –

+0

@HenkHolterman Czy możesz to wyjaśnić? Na pierwszy rzut oka przypadek ten pasuje do przykładów [tutaj] (https://msdn.microsoft.com/en-us/library/ms745795 (v = vs.110) .aspx) i [tutaj] (http: // /drwpf.com/blog/2010/05/05/value-coercion-for-the-masses/) –

Powiązane problemy