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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top