2011-10-05 3 views
2

Je suis relativement nouveau dans WPF, mais j'ai passé du temps à rechercher la validation WPF, et je n'ai pas encore vu une bonne approche de la validation conditionnelle.WPF paramètre les champs par programme comme requis

Pour simplifier grandement la situation, disons que j'ai deux zones de texte et un bouton d'envoi. L'utilisateur entre une chaîne dans la première zone de texte. Si l'utilisateur entre, par exemple "ABC", alors la deuxième zone de texte devrait être un champ obligatoire (je veux que l'arrière-plan soit une couleur bleu clair, pour signifier ceci), et le bouton de soumission devrait être désactivé jusqu'à ce que peuplé.

Comment cela peut-il être fait? Existe-t-il un moyen facile d'ajouter/supprimer des validations en cours d'exécution? 'DataAnnotations' (http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx) semblait être un bon point de départ, mais je ne peux pas marquer un champ avec l'attribut [Required], car le champ ne sera pas toujours nécessaire. Fondamentalement, j'ai besoin de quelque chose comme 'Required si Field1 =' ABC '

Merci!

Répondre

7

Je le manipulerais en utilisant MVVM et voici un exemple pour cela. Mettre en œuvre IDataError Info de la classe et qui mettra en œuvre deux propriétés erreur et cette [chaîne columnName] vous pouvez mettre en œuvre la deuxième propriété avec vos erreurs de liaison que vous voulez

public class MainViewModel:ViewModelBase,IDataErrorInfo 
{ 

public string Error 
    { 
    } 
public string this[string columnName] 

{ 
get 
    { 
    string msg=nulll; 
    switch(columnName) 
     { 
      case "MyProperty": //that will be your binding property 
      //choose your validation logic 
      if(MyProperty==0||MyProperty==null) 
      msg="My Property is required"; 
      break; 
     } 
    return msg; 
    } 
} 

également Set ValidateOnErrors = True dans la liaison d'une zone de texte . ici ColumnName est le nom de la propriété qui est modifiée et dont ValidateOnErrors est défini sur true. Cochez ici et mettre en place les conditions et le message de retour, puis vous verrez les erreurs sur l'info-bulle lorsque vous mettez ce style dans vos ressources.

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true" > 
       <Setter Property="Foreground" Value="Red"/> 
       <Setter Property="Background" Value="MistyRose"/> 
       <Setter Property="BorderBrush" Value="Red"/> 
       <Setter Property="BorderThickness" Value="1.0"/> 
       <Setter Property="VerticalContentAlignment" Value="Center"/> 
       <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

et voici un échantillon de la zone de texte

<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
Path=PropertyName,ValidatesOnDataErrors=True}" Name="textBox1"> 
    <Validation.ErrorTemplate> 
     <ControlTemplate> 
      </ControlTemplate> 
    </Validation.ErrorTemplate> 

</TextBox> 
+0

Merci beaucoup! Je pense que c'est exactement ce que je veux. – user981225

1

Je voudrais juste gérer cette logique dans votre ViewModel (en supposant que vous utilisez un modèle MVVM, si ce n'est juste dans votre code-behind).

Éteignez une logique sur l'événement TextChanged pour la première zone de texte qui définira finalement les propriétés appropriées. Essentiellement, je dis code cette validation manuellement. Une fois que vous commencez à entrer dans une logique de validation plus complexe, vous allez commencer à vous heurter aux limites des cadres de validation/validation déclarative.

Questions connexes