XAML: enlace de longitud máxima de cuadro de texto a constante de clase
Pregunta
Estoy intentando enlazar la propiedad Maxlength de un cuadro de texto WPF a una constante conocida en lo profundo de una clase. Estoy usando c #.
La clase tiene una estructura no muy diferente a la siguiente:
namespace Blah
{
public partial class One
{
public partial class Two
{
public string MyBindingValue { get; set; }
public static class MetaData
{
public static class Sizes
{
public const int Length1 = 10;
public const int Length2 = 20;
}
}
}
}
}
Sí, está profundamente anidado, pero desafortunadamente, en este caso no puedo mover mucho las cosas sin que se requieran reescrituras enormes.
Esperaba poder enlazar el cuadro de texto MaxLength a los valores Length1 o Length2 pero no puedo hacer que funcione.
Esperaba que el enlace fuera algo como lo siguiente:
<Textbox Text="{Binding Path=MyBindingValue}" MaxLength="{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" />
Cualquier ayuda es apreciada.
Muchas gracias
Solución 2
¡Fijo!
Inicialmente intenté hacer esto:
{Binding Path=MetaData+Sizes.Length1}
que compiló bien, sin embargo, el enlace falló en el tiempo de ejecución, a pesar de que la Clase 'Dos' es el contexto de datos que la ruta no pudo resolver en las clases estáticas internas (podría haber hecho algo como: {Ruta de enlace = {x: Estática MetaData + Size.Length1}}?)
Tuve que jugar un poco con el diseño de mis clases, pero el enlace ahora está funcionando.
Nueva estructura de clase:
namespace Blah
{
public static class One
{
// This metadata class is moved outside of class 'Two', but in this instance
// this doesn't matter as it relates to class 'One' more specifically than class 'Two'
public static class MetaData
{
public static class Sizes
{
public static int Length1 { get { return 10; } }
public static int Length2 { get { return 20; } }
}
}
public partial class Two
{
public string MyBindingValue { get; set; }
}
}
}
Entonces mi declaración de enlace es la siguiente:
xmlns:local="clr-namespace:Blah"
y
MaxLength="{x:Static local:MetaData+Sizes.Length1}"
Que parece funcionar bien. No estoy seguro de si las constantes debían convertirse o no en propiedades, pero no parece haber ningún daño al hacerlo.
¡Gracias a todos por su ayuda!
Otros consejos
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}"
Propiedades de referencia de periodos. Los signos más se refieren a clases internas.
intenta enlazar con x: estático. agregue un xmlns: espacio de nombres local con el espacio de nombres de Tamaños a su encabezado xaml y luego enlácelo con algo como esto:
{x:Static local:Sizes.Length1}
Desafortunadamente, con lo siguiente aparece el error Escriba 'One.Two.MetaData.Sizes' no encontrado
. No puedo crear un espacio de nombres local más profundo que " Blah " (bueno, de acuerdo con VS2008 de todos modos)
xmlns:local="clr-namespace:Blah"
y
MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}"
si One no es una clase estática, no puede enlazarla con x: Static. ¿Por qué usar clases internas? Si los metadatos están fuera de dos, y los tamaños son una propiedad, puede acceder fácilmente a ellos con x: Static. en este caso, no puede enlazar a tipos, solo a objetos existentes. pero uno y dos son tipos, no objetos.