XAML: Encadernação maxlength caixa de texto para Classe constante
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
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.