2010-12-09 64 views
3

J'ai implémenté un PropertyGrid et les propriétés de l'objet sélectionné (dans une autre bibliothèque) sont affichées. Les valeurs de propriété sont liées aux contrôles PropertyGrid via la liaison. Maintenant, je veux effectuer une validation sur les valeurs utilisateur entre PropertyGrid contrôle (principalement TextBox) et afficher un message à l'utilisateur si la valeur n'est pas correcte.Implémentation des validations dans WPF PropertyGrid

Il y aura quelques validations courantes comme les valeurs numériques, le champ requis, etc. et certaines validations liées à la logique métier (comme la valeur ne peut pas être supérieure à celle-ci, etc.).

Quelles sont toutes les approches disponibles pour implémenter ceci (IDataErrorInfo ou autre chose)?

Répondre

2

Si vous avez déjà mis en œuvre IDataErrorInfo sur votre ViewModels, je trouve ces données-modèle pour être très utile pour les erreurs d'affichage:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

De cette façon, il suffit de mettre ValidatesOnDataErrors=True sur vos fixations de zone de texte et vous obtenir une info-bulle affichant l'erreur si quelque chose ne va pas. Cela peut également être appliqué à d'autres contrôles.

Pour plus d'informations sur la façon de mettre en œuvre IDataErrorInfo correctement, regardez ici:
http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx
ont surtout un oeil à la section « 3.5 IDataErrorInfo soutien »

+0

Merci Botz, pouvez-vous s'il vous plaît me fournir un code sur la façon dont vous avez implémenté IDataErrorInfo dans vos ViewModels. En fait, dans mon cas, j'ai des propriétés de dépendance dans mes contrôles (dérivé de UserControl), j'ai besoin de valider ces propriétés. – akjoshi

+0

J'ai ajouté un lien où vous pouvez voir comment l'implémenter. – Botz3000

+0

J'ai vu cet article hier, mais je suis confus sur la façon d'implémenter IDataErrorInfo avec les contrôles hérités. J'ai un BaseControl (ayant des propriétés de dépendance communes) et mes contrôles sont hérités de ce contrôle de base et ont d'autres propriétés de dépendance. J'ai besoin d'effectuer des validations sur toutes les propriétés de dépendance (parent + enfant). – akjoshi

0

Je recommande d'utiliser IDataErrorInfo. De cette façon, la logique de validation reste attachée à ViewModel et non à UI. Et WPF a bien le soutien pour cela aussi bien.

1

J'ai eu récemment pour faire face à ce problème donc je vais Postez cet exemple de code pour aider les autres avec le même problème.

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Text; 

namespace ValidationExample 
{ 

    public class SomeClass : DataErrorInfoImpl 
    { 
     [CustomValidation(typeof (SomeClassValidator), "ValidateSomeTextToValidate")] 
     string SomeTextToValidate {get;set;} 

    } 

    public class SomeClassValidator 
    { 
     public static ValidationResult ValidateNumberOfLevelDivisons(string text) 
     { 
      if (text != "What every condition i want") return new ValidationResult("Text did not meet my condition."); 
      return ValidationResult.Success; 
     } 

    } 

    public class DataErrorInfoImpl : IDataErrorInfo 
    { 
     string IDataErrorInfo.Error { get { return string.Empty; } } 

     string IDataErrorInfo.this[string columnName] 
     { 
      get 
      { 
       var pi = GetType().GetProperty(columnName); 
       var value = pi.GetValue(this, null); 

       var context = new ValidationContext(this, null, null) { MemberName = columnName }; 
       var validationResults = new List<ValidationResult>(); 
       if (!Validator.TryValidateProperty(value, context, validationResults)) 
       { 
        var sb = new StringBuilder(); 
        foreach (var vr in validationResults) 
        { 
         sb.AppendLine(vr.ErrorMessage); 
        } 
        return sb.ToString().Trim(); 
       } 
       return null; 
      } 
     } 
    } 
} 

Ce style devrait fonctionner sur WPF et WPF Xceed.PropertyGrid PropertyTools.PropertyGrid.