Validation De Liaison.HasError propriété dans MVVM
Je suis actuellement à la mise en œuvre d'un ValidationRule
de vérifier si des caractères non valides sont dans une zone de texte. Je suis heureux que la définition de la classe I ont mis en œuvre qui hérite ValidationRule
sur ma zone de texte met en rouge lorsque ces caractères sont trouvé, mais je tiens également à utiliser la Validation.HasError
de la propriété ou de la Validation.Les erreurs de la propriété de la pop une boîte de message indiquant à l'utilisateur qu'il y a des erreurs dans les différentes zones de texte dans la page.
Est-il un moyen de lier une propriété dans mon ViewModel
à la Validation.HasError
et/ou à la Validation.Les erreurs de propriétés dans l'ordre pour moi d'avoir accès à eux dans mon ViewModel?
Ici, c'est mon style d'erreur pour la zone de texte:
<Style x:Key="ErrorValidationTextBox" TargetType="{x:Type pres:OneTextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Red"
FontSize="12pt"
Text="{Binding ElementName=MyAdorner,
Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
</TextBlock>
<AdornedElementPlaceholder x:Name="MyAdorner"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Ici est de savoir comment je déclarer mes TextBox (OneTextBox encapsule la régulière WPF zone de texte) dans mon code XAML:
<pres:OneTextBox Watermark="Name..." Margin="85,12,0,0" Style="{StaticResource ErrorValidationTextBox}"
AcceptsReturn="False" MaxLines="1" Height="22" VerticalAlignment="Top"
HorizontalAlignment="Left" Width="300" >
<pres:OneTextBox.Text>
<Binding Path="InterfaceSpecification.Name" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<interfaceSpecsModule:NoInvalidCharsRule/>
</Binding.ValidationRules>
</Binding>
</pres:OneTextBox.Text>
</pres:OneTextBox>
Oui, comme avec ma règle de validation, la seule chose qui se passe c'est que la frontière de ma zone de texte devient rouge. Il n'empêche pas l'utilisateur à partir de la saisie d'autres personnages (même si, quand il y a un caractère non valide le Nom de la propriété cesse d'être mis à jour) ou qu'il n'a pas empêché de créer un InterfaceSpecification avec ce nom. J'ai pu lier la Validation.HasError sur le bouton "soumettre" de ma forme, mais je suis en utilisant un cadre personnalisé et n'ont pas accès à ce bouton (comme c'est privé, à l'intérieur de la forme de contrôle, malheureusement).
OriginalL'auteur Choub890 | 2014-04-03
Vous devez vous connecter pour publier un commentaire.
La
Validation.HasError
est readonly propriété, doncBinding
ne fonctionnera pas avec cette propriété. Ceci peut être vu dansILSpy
:Comme alternative, vous devriez voir une grande
article
qui fournit une solution de la forme d'utilisation attaché les propriétés de dépendance, vous allez y voir une explication détaillée de l'exemple.Ci-dessous est un exemple complet de cet article, j'ai juste traduit en vertu de
C#
, la langue d'origine estVB.NET
:XAML
Code-behind
Comme une alternative à l'utilisation de
ValidationRule
, dans MVVM de style, vous pouvez essayer de mettre en œuvreIDataErrorInfo
Interface. Pour plus d'informations, voir ce:Application de Business Complexe de Règles de Données avec WPF
Vous pouvez prévenir la valeur de ce dernier étant situé dans le setter si la nouvelle valeur n'est pas valide, mais élever INotifyPropertyChanged de l'événement, de sorte que la zone de texte est mis à jour avec l'ancienne valeur, qui n'en a pas changé.
Cela fonctionne bien avec la normale xaml, mais dans un contrôle personnalisé quand j'essaie de lier la propriété attachée à l'aide d'un modèle de liaison, le BindingOperations.IsDataBound(d,MVVMHasErrorProperty) appel en CoerceMVVMHasError(...) renvoie la valeur faux, de sorte que le rappel n'est jamais installé. Toutes les idées sur la façon de faire ce travail dans un contrôle personnalisé?
Stewart: Pouvez-vous donner un exemple concret de la non-projet de travail? Comment le temps, je vais voir.
Nikolaev: j'ai ajouté un exemple comme une réponse à cette question qui montre votre technique de travail avec la norme XAML, et de ne pas travailler alors que XAML est placé à l'intérieur d'un contrôle personnalisé. Merci!
OriginalL'auteur Anatoliy Nikolaev
En réponse à Anatoliy de la demande pour un exemple de non-travail du projet:
Générique.xaml
TextBoxCustomControl.cs
HasErrorUtility.cs
ViewModel.cs
MainWindow.xaml
Validation.HasError
en premier lieu nécessaire lors de l'utilisation deValidationRule
,dans votre exemple, il n'est pas. En outre, dans mon ordinateur (Windows 7), les deux exemples return false dans le Forcer() de la fonction. Le sens de cet exemple queBinding
ne travaille pas dansValidation.HasError
par défaut, parce que cette propriété n'est pas une propriété de dépendance, et cet exemple compense cet inconvénient.D'ailleurs,dans votre contrôle personnalisé que vous êtes tout simplement l'attribution d'une valeur booléenne d'une dépendance de la propriété -> dans cette situation Contraindre la fonction ne sera normalement pas appelé dans HasErrorUtility.OriginalL'auteur Brian Stewart