Utilisation de la validation dans WPF avec des déclencheurs de propriétés et de styles de dépendance

StackOverflow https://stackoverflow.com/questions/96377

  •  01-07-2019
  •  | 
  •  

Question

J'essaie d'utiliser la validation dans WPF. J'ai créé une NotNullOrEmptyValidationRule comme indiqué ci-dessous:

public class NotNullOrEmptyValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (String.IsNullOrEmpty(value as String))
                return new ValidationResult(false, "Value cannot be null or empty");

            return new ValidationResult(true, null); 
        }
    }

Maintenant, je dois l’utiliser dans mon application. Dans mon fichier App.xaml, j'ai déclaré le style de la zone de texte. Voici la déclaration.

 <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">

            <Setter Property="Background" Value="Green"/>

            <Style.Triggers>

                <Trigger Property="Validation.HasError" Value="True">

                    <Setter Property="Background" Value="Red"/>
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>

                </Trigger>

            </Style.Triggers>

        </Style>

Maintenant, je veux l'utiliser sur ma zone de texte pour utiliser le code suivant:

  <TextBox Style="{StaticResource textBoxStyle}">
                <TextBox.Text>
                    <Binding>
                        <Binding.ValidationRules>
                            <NotNullOrEmptyValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>


            </TextBox>

L'erreur survient sur la balise NotNullOrEmptyValidationRule. Le vérificateur de syntaxe XAML n'est pas en mesure de résoudre le NotNullOrEmptyValidationRule. J'ai même essayé de mettre l'espace de noms mais cela ne semble pas fonctionner.

Était-ce utile?

La solution

Je vois que votre liaison sur la zone de texte est définie sur un chemin "Texte" - s'agit-il d'un champ situé dans le contexte de la zone de texte de cette zone de texte? la zone de texte obtient-elle réellement une valeur? de plus, si vous mettez un point d'arrêt dans votre méthode de validation, cela se fait-il jamais virer?

vous voudrez peut-être rechercher comment enregistrer les échecs dans la liaison et les examiner également ..

Autres conseils

Il vous suffit d’ajouter les xmlns à votre fenêtre et de vous en servir pour référencer votre ValidationRule.

Sous WPF, l’objet convient parfaitement pour être utilisé à partir du même assemblage.

Etant donné que votre règle n'est pas définie dans l'espace de nom XAML standard, vous devez créer un mappage sur votre espace de nom Clr comme suit:

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">

Et vous l'utiliseriez comme suit:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>

Modifier J'ai ajouté une déclaration de chemin à la liaison. Vous devez indiquer à la liaison à quoi vous connecter:)

Vous n'avez pas cette ligne dans votre code derrière

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    Me.**NameOfTextBox**.DataContext = Me
End Sub

Il existe un bogue dans Visual Studio et Expression Blend qui est à l'origine de ce problème. Ce que vous devez faire est de vous assurer que la règle de validation se trouve dans un projet / assemblage distinct que vous pouvez référencer. Cela devrait résoudre le problème.

Cependant, vous devrez rajouter l'espace de noms pour qu'il puisse fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top