wpf - ¿Cómo puedo cambiar el valor predeterminado de una propiedad de dependencia heredada?
subclass dependency-properties (1)
¿Cómo puedo cambiar el valor predeterminado para una propiedad de dependencia heredada? En nuestro caso, hemos creado una subclase de Control que, de forma predeterminada, tiene su conjunto Focusable
en "verdadero". Queremos que nuestra subclase tenga el valor predeterminado de "falso".
Lo que hemos estado haciendo es simplemente configurarlo como ''falso'' en el constructor, pero si alguien usa ClearValue, vuelve al valor predeterminado, no al valor establecido en el constructor.
Esto es lo que estoy haciendo actualmente para lograr esto (Este es un control de prueba con un DP de ''Foo'' para un ejemplo). No soy un fan de lo ''nuevo'' para ocultar la propiedad, aunque gracias a AddOwner
, sí apunta a la misma instancia compartida, así que supongo que está bien. Parece que también hereda todos los otros valores de metadatos, así que eso es bueno. Sólo me pregunto si esto es correcto?
public class TestControlBase : Control
{
public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
"Foo",
typeof(int),
typeof(TestControlBase),
new FrameworkPropertyMetadata(4) // Original default value
);
public int Foo
{
get { return (int)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
}
public class TestControl : TestControlBase
{
public static readonly new DependencyProperty FooProperty = TestControlBase.FooProperty.AddOwner(
typeof(TestControl),
new FrameworkPropertyMetadata(67) // New default for this subclass
);
}
marca
ACTUALIZAR...
Creo que esto es aún mejor, ya que elimina la llamada "nueva". Aún tiene acceso a través de FooProperty en la clase base ya que esto usa AddOwner
. Como tal, es técnicamente el mismo.
public class TestControl : TestControlBase
{
// Note this is private
private static readonly DependencyProperty AltFooProperty = TestControlBase.FooProperty.AddOwner(
typeof(TestControl),
new FrameworkPropertyMetadata(67) // New default for this subclass
);
}
La forma correcta de anular la propiedad de una clase base es:
static TestControl() {
FooProperty.OverrideMetadata(
typeof(TestControl),
new FrameworkPropertyMetadata(67)
);
}
EDITAR:
AddOwner
está destinado a compartir la misma AddOwner
DependencyProperty
entre los tipos que no están relacionados (es decir, la TextProperty
de TextBox
de TextBox
y TextBlock
).