Question

J'ai toujours admiré la façon dont Josh Smith a construit son exemple d'application. Et j'ai également essayé d'imiter la façon dont les anciens de vue de son application implémentent la propriété idataerrorinfo et via un datamplate personnalisé rend les erreurs devant l'utilisateur. Voici le modèle de données qu'il utilise pour afficher l'erreur:

<DataTemplate DataType="{x:Type ValidationError}">
  <TextBlock FontSize="10"
             FontStyle="Italic"
             Foreground="Red"
             HorizontalAlignment="Right"
             Margin="0,1"
             Text="{Binding Path=ErrorContent}"/>
</DataTemplate>

Un échantillon de travail de ce modèle de données est le suivant est le suivant:

<TextBox x:Name="txtUsername"
         Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2"
         Width="300"
         Margin="2" 
         Text="{Binding Path=Username,
             ValidatesOnDataErrors=True,
             UpdateSourceTrigger=PropertyChanged}"
         Validation.ErrorTemplate="{x:Null}"/>

<ContentPresenter Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" 
                  Content="{Binding ElementName=txtUsername,
                      Path=(Validation.Errors).CurrentItem}"/>

Le errortemplate par défaut de la zone de texte (une limite rouge qui apparaît autour de lui) est remplacée par un nouveau modèle d'erreur dans lequel un présentateur de contenu placé juste en dessous de la zone de texte transmettra l'erreur à l'utilisateur - certainement un modèle supérieur et plus élégant.

Si vous avez lu le code ci-dessus, vous avez peut-être deviné que j'essaie de créer un formulaire de connexion.

Malheureusement, les formulaires de connexion exigent le mot de passe (et par la suite Passwordbox). Passwordbox ne fournit pas de «mot de passe» comme propriété de dépendance. Je ne voulais pas rompre la directive MVVM pour essayer d'éviter le code autant que possible et j'ai donc été tenté d'opter pour le Passwordboxassistant classe mentionnée ici. Sinon, c'est une belle solution, sauf une chose. Il ne me laisse pas valider la zone de mot de passe avec le modèle de données de Josh. J'ai validé la propriété de mot de passe de mon ViewModel pour ne pas être vide. La propriété est validée car mon bouton "Connexion" n'est pas activé sans que l'utilisateur remplisse le mot de passe. Mais le message "Entrez le mot de passe" que j'ai défini dans le cadre de cette validation de propriété n'est pas rendu par le présentateur de contenu qui se trouve sous la boîte de passe. Voici le code:

<Label Content="Password:" Grid.Column="0" Grid.Row="2" Margin="2" />

<PasswordBox x:Name="PasswordBox"
             Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"
             Margin="2"
             Validation.ErrorTemplate="{x:Null}" 
             ff:PasswordBoxAssistant.BindPassword="true"  
             ff:PasswordBoxAssistant.BoundPassword="{Binding Path=Password,
                 Mode=TwoWay,
                 UpdateSourceTrigger=PropertyChanged}"/>

<ContentPresenter Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2"
                  Content="{Binding ElementName=PasswordBox,
                  Path=(Validation.Errors).CurrentItem}"/>

Inutile de dire que le FF dans le code ci-dessus représente la référence de l'espace de noms:

xmlns:ff="clr-namespace:MyProject.UserViews"

Je suis sûr que ce problème se produit car la propriété du mot de passe a été étendue par la classe d'aide. Si je dépose cette approche, je devrai supprimer la propriété du mot de passe de l'implémentation idataerrorinfo et sur le bouton de connexion, le clic devra le vérifier, présentant à l'utilisateur une boîte de message. Mais non sans compromettre la cohérence. Je ne suis pas très conscient des propriétés de dépendance; Peut-il y avoir une solution de contournement? La modification de la classe d'assistance me permettra-t-elle de remettre le message d'erreur rouge en place?

Pas de solution correcte

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