10
votes

WPF Textbox Maxlength - Y a-t-il un moyen de se lier à la longueur maximale de la validation de données sur le champ Lié?

ViewModel: xxx

xaml: xxx

existe-t-il un moyen d'éviter de régler la longueur maximale de la zone de texte pour correspondre à mon point de vue (ce qui pourrait changer car il est dans un assemblage différent) et définir automatiquement la longueur maximale en fonction de l'exigence de longueur stringlength?


0 commentaires

5 Réponses :


0
votes

Une façon de le faire serait de créer une propriété dans la même viewModel appelée quelquepropertymaxlength, puis de lier la propriété maxlength à cette propriété.

<TextBox Text="{Binding SomeProperty}" MaxLength="{Binding SomePropertyMaxLength}"/>


2 commentaires

Oui, j'ai pensé à cela, mais je voulais vraiment éviter de traverser et d'ajouter des propriétés supplémentaires qui réfléchissent sur mes métadonnées, puis de traverser tout mon XAML et de lier à ces propriétés ... J'espérais un type "sous les couvertures" de chemin ... peut-être par des comportements ci-joints?


Vous pouvez modifier votre "quelqueProperty" pour être un objet qui contient la valeur de chaîne et la valeur maxlength, puis lier à ces propriétés respectivement. De cette façon, vous n'aurez pas à créer de nouvelles propriétés, mais vous devrez toujours passer par les modifications XAML.



1
votes

Pendant que je ne vais pas écrire le code complètement moi-même, une idée est de créer votre propre markupextension qui prendra le nom de la propriété et réfléchir à la recherche d'un stringlengthatetribute . .

Si l'attribut existe, essayez de lier la cible à cette valeur (à l'aide de la réflexion). Sinon, alors liez 0 à la valeur cible (0 est par défaut, c'est-à-dire non max).


1 commentaires

J'ai eu un enfer d'une époque qui tente de comprendre comment écrire cette extension afin qu'elle fait ce que vous dites.




0
votes

L'extension de balisage est définitivement la voie à suivre. Je crée une sous-classe de BindingDecoratorAtorAnbase appelée Binding, qui a une propriété de dépendance de type de données de type modèle. Comme les markupextensions sont créées lors de l'initializececomponent (), il n'existe aucun moyen de déterminer le DataContext car il n'aura pas été défini.

Fournir le type de modèle permet un accès réfléchissant aux attributs définis sur le modèle. Ce permis:

  • Réglage de la maxlength pour les zones de texte.
  • Réglage StringFormat pour TextBlocks.
  • Réglage du convertisseur par défaut en fonction du type de données de membre.
  • Ajout de la validation requise. Utilisation de la validationDrules de la liaison ou de paramètres validateDaTerrors.

    Le balisage ressemble à: Text = "{PO: DataType de liaison = Modèle: modaccount, chemin = subaprunt}"

    Mise en forme, maxlength et conversion déployée en un seul paquet sans nécessiter de changer quoi que ce soit les classes de modèle.


0 commentaires

0
votes

ou vous pouvez avoir votre modèle uniquement pour accepter un # caractères maximum: xxx


1 commentaires

devrait être 'valeur.longueur - 1'