Pergunta

Eu estou tentando vincular propriedade MaxLength de uma caixa de texto WPF a uma constante conhecida profundamente dentro de uma classe. Eu estou usando c #.

A classe tem uma estrutura não muito diferente ao seguinte:

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;
                 }
             }
        }
    }
}

Sim, é profundamente aninhados, mas, infelizmente, neste caso eu não posso mover coisas rodada muito sem grandes regravações necessários.

Eu estava esperando que eu seria capaz de se ligar a MaxLength caixa de texto para os valores comprimento1 ou Length2 mas não posso fazê-lo funcionar.

Eu estava esperando a ligação para ser algo como o seguinte:

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

Qualquer ajuda é apreciada.

Muitos agradecimentos

Foi útil?

Solução 2

Fixed!

Inicialmente eu tentei fazer isso:

{Binding Path=MetaData+Sizes.Length1}

que compilou ok, no entanto, a ligação falhou em tempo de execução, apesar do 'Two' Classe sendo o datacontext o caminho não poderia resolver nas classes estáticas internas (eu poderia ter feito algo como: {Binding Path = {x: Static MetaData + Size.Length1}}?)

Eu tive que mexer com o layout das minhas aulas um pouco, mas a ligação está trabalhando agora.

New estrutura de classe:

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; }
        }
    }
}

Em seguida, a minha declaração de ligação é a seguinte:

xmlns:local="clr-namespace:Blah"

e

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

O que parece ok trabalho. Eu não tenho certeza se deve ou não as constantes necessárias para ser convertido em propriedades, mas não parece haver qualquer problema em fazê-lo.

Obrigado a todos por sua ajuda!

Outras dicas

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

períodos de referência propriedades. Os sinais de mais referir-se a classes internas.

tentar se ligam com x: Static. adicionar um xmlns: namespace local com o namespace de tamanhos para seu cabeçalho XAML e, em seguida, ligar com algo como isto:

{x:Static local:Sizes.Length1}

Infelizmente, com a seguinte recebo a Type 'One.Two.MetaData.Sizes' not found erro. Eu não posso criar um namespace local mais profundo do que "Blah" (bem de acordo com VS2008 anyway)

xmlns:local="clr-namespace:Blah"

e

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

Se a pessoa não é uma classe estática você não pode vincular a ele com x: Static. por que usar classes internas? se metadados está fora de dois, e Tamanhos é uma propriedade, você pode acessá-lo facilmente com x: Static. você não pode vincular a tipos neste caso, apenas para objetos existentes. mas um e dois são tipos, e não objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top