2010-11-04 6 views
7

Je voudrais savoir comment activer la validation par programmation sur un DataGridColumn. Ce serait à peu près la même chose que donde appelant la méthode UpdateSource d'une BindingExpression, mais je n'arrive pas à obtenir la BindingExpression de la colonne.Validation de colonne Force DataGrid (WPF)

Merci.

PS: définir la propriété ValidatesOnTargetUpdated sur le ValidationRule est pas ce que je cherche :)

Répondre

1

Dans le .NET Framework 4, un espace de nommage appelé System.ComponentModel.DataAnnotations est disponible pour le CLR commun (WPF) et le plus léger Silverlight CLR. Vous pouvez utiliser l'espace de noms DataAnnotations à diverses fins. L'un d'eux concerne la validation des données à l'aide d'attributs, et l'autre est la description visuelle des champs, propriétés et méthodes, ou pour personnaliser le type de données d'une propriété spécifique. Ces trois catégories sont classées dans le .NET Framework en tant qu'attributs de validation, attributs d'affichage et attributs de modélisation de données. Cette section utilise Attributs de validation pour définir les règles de validation des objets

http://www.codeproject.com/KB/dotnet/ValidationDotnetFramework.aspx

1

@ user424096,

J'ai pas accès à mon environnement studio visuel, mais suivant le code de pseudo peut vous guider pour votre manière souhaitée .. .

  1. Créer une propriété booléenne appelée ci-joint NotifySourceUpdates et attach est à DataGridCell ... Je joins ce soit au niveau DataGrid afin qu'il applique à toutes les cellules de la grille de données ... vous pouvez joindre il au niveau de la colonne et ...

     <DataGrid ItemsSource="{Binding}"> 
           <DataGrid.CellStyle> 
             <Style TargetType="DataGridCell" > 
               <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> 
             </Style> 
           </DataGrid.CellStyle> 
         </DataGrid> 
    
  2. Ce comportement attaché gère l'événement appelé ci-joint Binding.SourceUpdated au niveau cellulaire. Ainsi, chaque fois qu'une liaison dans le mode normal ou d'édition d'un élément de l'interface utilisateur enfant a sa source mise à jour, elle se déclenche et passe au niveau de la cellule.

     public static readonly DependencyProperty NotifySourceUpdatesProperty 
         = DependencyProperty.RegisterAttached(
          "NotifySourceUpdates", 
          typeof(bool), 
          typeof(MyAttachedBehavior), 
          new FrameworkPropertyMetadata(false, OnNotifySourceUpdates) 
         ); 
    
         public static void SetNotifySourceUpdates(UIElement element, bool value) 
         { 
          element.SetValue(NotifySourceUpdatesProperty, value); 
         } 
    
         public static Boolean GetNotifySourceUpdates(UIElement element) 
         { 
          return (bool)element.GetValue(NotifySourceUpdatesProperty); 
         } 
    
         private static void OnNotifySourceUpdates(DependencyObject d, DependencyPropertyEventArgs e) 
         { 
          if ((bool)e.NewValue) 
          { 
           ((DataGridCell)d).AddHandler(Binding.SourceUpdated, OnSourceUpdatedHandler); 
          } 
         } 
    
  3. Dans ce gestionnaire d'événements, les args d'événements sont des DataTransferEventArgs de type qui vous donne la TargetObject. Ce sera votre contrôle qui doit valider.

    private static void OnSourceUpdatedHandler(object obj, DataTransferEventArgs e) //// Please double check this signature 
    { 
        var uiElement = e.TargetObject as UIElement; 
        if (uiElement != null) 
        { 
         ///... your code to validated uiElement.       
        } 
    } 
    
  4. Ici vous devez savoir quelle valeur représentée par le contrôle est valide ou invalide.

    (uiElement.MyValue == null) //// Invalid!! 
    
  5. Si vous voulez lier de contrôle à invalider, il suffit d'utiliser l'appel MarkInvalid en procédant comme suit ...

    ValidationError validationError = 
         new ValidationError(myValidationRule, 
         uiElement.GetBindingExpression(UIElement.MyValueDependecyProperty)); 
    
    validationError.ErrorContent = "Value is empty!"; 
    
    Validation.MarkInvalid(uiElement.GetBindingExpression(UIElement.MyValueDependencyProperty), validationError); 
    

Laissez-moi savoir si cela fonctionne ...