2008-10-24 19 views
18

Estoy intentando vincular la propiedad Maxlength de un cuadro de texto WPF a una profundidad constante conocida dentro de una clase. Estoy usando C#.XAML: vinculación textbox maxlength a constante de clase

La clase tiene una estructura no muy diferente a lo 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 por desgracia en este caso no me puedo mover cosas redondas mucho sin grandes reescrituras requeridos.

Estaba esperando poder vincular el cuadro de texto MaxLength a los valores Length1 o Length2 pero no puedo hacerlo funcionar.

que estaba esperando la unión a ser algo así como lo siguiente:

<Textbox Text="{Binding Path=MyBindingValue}" MaxLength="{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" /> 

se aprecia ninguna ayuda.

Muchas gracias

Respuesta

6

¡Reparado!

Inicialmente He intentado hacer esto:

{Binding Path=MetaData+Sizes.Length1} 

el cual compila bien, sin embargo la unión fallado en tiempo de ejecución, a pesar de la Clase 'Dos' la DataContext siendo el camino no pudo resolver en las clases estáticas internas (podría He hecho algo como: {Binding Path = {x: Static MetaData + Size.Length1}}?)

Tuve que jugar un poco con el diseño de mis clases pero el enlace ahora está funcionando.

nueva estructura de clases:

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 unión es el 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 deben o no convertirse en propiedades, pero no parece haber ningún daño al hacerlo.

¡Gracias a todos por su ayuda!

0

intente enlazar con x: Estático. añadir xmlns: espacio de nombres local con el espacio de nombres de tamaños para su cabecera xaml y luego enlazar con algo como esto:

{x:Static local:Sizes.Length1} 
0

Por desgracia, con la siguiente consigo el error Type 'One.Two.MetaData.Sizes' not found. No puedo crear un espacio de nombres local, más allá de "Bla" (también de acuerdo con VS2008 todos modos)

xmlns:local="clr-namespace:Blah" 

y

MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}" 
0

si uno no es una clase estática que no se puede obligar a la misma con x: Estático. ¿por qué usar clases internas? si los metadatos están fuera de dos y Sizes es una propiedad, puede acceder fácilmente con x: Static. no se puede enlazar a tipos en este caso, solo a objetos existentes. pero Uno y Dos son tipos, no objetos.

37
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}" 

Periodas de propiedades de referencia. Los signos más se refieren a las clases internas.

+0

¡Esto fue información útil! ¡Pero aún no tengo la reputación suficiente para hacer clic en él! – Ash

+0

Muy útil para mí también. Gracias Stusmith – ganeshran

Cuestiones relacionadas