Jak można zarejestrować właściwość zależności, której wartość jest obliczana przy użyciu wartości innej właściwości zależności?Właściwość zależności zależna od innej
Ponieważ opakowania programu .NET są pomijane przez WPF w czasie wykonywania, nie należy uwzględniać logiki w programach pobierających i ustawiających. Rozwiązaniem tego jest zwykle użycie s. PropertyChangedCallback
. Ale są one uznawane za statyczne.
Na przykład, co jest właściwą drogą do osiągnięcia tego contrived zadanie:
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set
{
SetValue(TestBoolProperty, value);
TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY
}
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel));
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel));
Dopóki zależność nie jest okrągła, czy istnieje odpowiednie środki, aby osiągnąć ten cel?
Jaka jest zaleta korzystania z 'CoerceValueCallback' w porównaniu z bezpośrednią zmianą właściwości zależności w ramach właściwości PropertyChangedCallback innego obiektu zależnego, jak zrobił to opedog? Ze zgromadzonej przeze mnie dokumentacji wynika, że twoja metoda jest bardziej właściwa, ale jestem ciekawa praktycznej różnicy. – Gregyski
Cóż, aby nazwać parę: nie rozbija powiązań z tą właściwością (tj. Jeśli ta właściwość jest celem wyrażenia wiążącego, będzie działać po wymuszeniu, ale zostanie utracona po jawnym ustawieniu); ma wyższy priorytet w rozwiązywaniu wartości właściwości zależności (tzn. jeśli mówisz PropA = "Coś", co nie oznacza, że PropA == "Coś", ponieważ przymus może zignorować to przypisanie); Zapamiętuje starą wartość twojej własności (tj. Następnym razem, gdy wywołasz CoerceValue(), otrzymasz oryginalną wartość TestDouble, a nie tę ustawioną lokalnie) – Anvaka