XAML: Liaison de la zone de texte maxlength à la constante de classe
Question
J'essaie de lier la propriété Maxlength d'une zone de texte WPF à une constante connue d'une classe. J'utilise c #.
La classe a une structure pas très différente de la suivante:
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;
}
}
}
}
}
Oui, il est profondément imbriqué, mais malheureusement dans ce cas, je ne peux pas trop bouger les choses sans avoir à réécrire énormément.
J'espérais pouvoir associer la zone de texte MaxLength aux valeurs Length1 ou Length2 mais je ne parviens pas à le faire fonctionner.
Je m'attendais à ce que la liaison ressemble à ce qui suit:
<Textbox Text="{Binding Path=MyBindingValue}" MaxLength="{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" />
Toute aide est appréciée.
Merci beaucoup
La solution 2
Fixé!
Au départ, j'ai essayé de faire ceci:
{Binding Path=MetaData+Sizes.Length1}
qui a bien compilé, cependant la liaison a échoué au moment de l'exécution, bien que la classe 'Two' soit le contexte de données que le chemin ne puisse pas résoudre en classes statiques internes (aurais-je pu faire quelque chose comme: {Binding Path = {x: Static MetaData + Size.Length1}}?)
J'ai dû modifier un peu la disposition de mes classes, mais la reliure fonctionne maintenant.
Nouvelle structure 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; }
}
}
}
Ensuite, ma déclaration de liaison est la suivante:
xmlns:local="clr-namespace:Blah"
et
MaxLength="{x:Static local:MetaData+Sizes.Length1}"
Ce qui semble fonctionner correctement. Je ne sais pas si les constantes doivent être converties en propriétés, mais cela ne semble pas poser de problème.
Merci à tous pour votre aide!
Autres conseils
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}"
Propriétés de référence des périodes. Les signes plus font référence aux classes intérieures.
essayez de vous lier avec x: Static. ajoutez un espace de noms xmlns: local avec l'espace de noms de Sizes à votre en-tête xaml, puis créez un lien avec quelque chose comme ceci:
{x:Static local:Sizes.Length1}
Malheureusement, l'erreur suivante s'affiche avec le code . Tapez 'One.Two.MetaData.Sizes' not found
. Je ne peux pas créer un espace de noms local plus profond que "Blah". (bien selon VS2008 quand même)
xmlns:local="clr-namespace:Blah"
et
MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}"
Si One n’est pas une classe statique, vous ne pouvez pas le lier avec x: Static. pourquoi utiliser des classes internes? si les métadonnées sont en dehors de deux et que Sizes est une propriété, vous pouvez facilement y accéder avec x: Static. dans ce cas, vous ne pouvez pas vous lier à des types, uniquement à des objets existants. mais One et Two sont des types, pas des objets.