¿Cómo se puede registrar una propiedad de dependencia cuyo valor se calcula utilizando el valor de otra propiedad de dependencia?Dependencia Propiedad dependiente de otra
Como WPF omite las envolturas de propiedades .NET en tiempo de ejecución, no se debe incluir la lógica en los get y setters. La solución a eso es típicamente usar PropertyChangedCallback
s. Pero esos son declarados estáticos.
Por ejemplo, ¿cuál es la forma correcta de realizar esta tarea artificial:
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));
Mientras que la dependencia no es circular, es que hay un medio apropiado para lograr esto?
¿Cuál es la ventaja de usar un 'CoerceValueCallback' como lo has hecho versus cambiar directamente una propiedad de dependencia dentro de' PropertyChangedCallback' de otra propiedad de dependencia como lo hizo opedog? De la documentación que vinculó, deduje que el suyo es el método más adecuado, pero tengo curiosidad acerca de la diferencia práctica. – Gregyski
Bueno, para nombrar pareja: no rompe enlaces a esta propiedad (es decir, si esta propiedad es un objetivo de expresión de enlace, funcionará después de la coerción pero se perderá después de establecerse explícitamente); tiene mayor prioridad en la resolución de valor de propiedad de dependencia (es decir, si dices PropA = "Algo" que no significa que PropA == "Algo", ya que la coerción podría ignorar esa asignación); Recuerda el valor anterior de su propiedad (es decir, la próxima vez que llame a CoerceValue() obtendrá el valor original de TestDouble, no el que se estableció localmente) – Anvaka