2010-12-10 5 views
0

Quelqu'un at-il un exemple de validation de la ligne croisée pour WPF Datagrid. La validation au niveau de la cellule et la validation Rowlevel ne répondent pas à mes exigences. J'essaie de rester avec MVVM autant que possible. ma dernière option est d'utiliser le code derrière. Donc, fondamentalement, j'ai besoin d'accéder à la Itemssource quand quelque chose se passe dans la grille. Toute aide est très appréciée. Merci -ReyWPF Datagrid Validation croisée des lignes

+0

vous utilisez Entity Framework? –

+0

oui et c'est une application serveur client ... – Manohar

Répondre

1

sur le code derrière ajouter une classe partielle à chaque table.

La propriété [HasNoError] est de retour vrai s'il n'y a pas d'erreurs

La propriété [Error] est renvoyer les erreurs sous forme de chaîne

if(tablename.HasNoError) 
{ 
// do your logic 
} 
else 
{ 
// display tablename.Error 
} 

Du côté XAML utiliser la liaison

<DataGridTextColumn Binding="{Binding Path=ActualFieldName1, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged }" Header=" ActualFieldName1" /> 

et ceci est l'exemple de classe utilisant IDataErrorInfo-

public partial class tablename : IDataErrorInfo 
{ 
    private Dictionary<string, string> errorCollection = new Dictionary<string, string>(); 
    public bool HasNoError 
    { 
     get 
     { 
      return string.IsNullOrWhiteSpace(Error); 
     } 
    } 
    public string Error 
    { 
     get 
     { 
      if (errorCollection.Count == 0) 
       return null; 
      StringBuilder errorList = new StringBuilder(); 
      var errorMessages = errorCollection.Values.GetEnumerator(); 
      while (errorMessages.MoveNext()) 
       errorList.AppendLine(errorMessages.Current); 
      return errorList.ToString(); 
     } 
    } 
    public string this[string fieldName] 
    { 
     get 
     { 
      string result = null; 
      switch (fieldName) 
      { 
       case "ActualFieldName1": 
        if (string.IsNullOrWhiteSpace(this.ActualFieldName1)) 
        { 
         result = "ActualFieldName1 is required."; 
        }; 
        if (Other_Condition) 
        { 
         result = "Other Result"; 
        }; 
        break; 
       case "ActualFieldName2": 
        if (string.IsNullOrWhiteSpace(this.ActualFieldName2)) 
        { 
         result = "ActualFieldName2 is required."; 
        }; 
        if (Other_Condition) 
        { 
         result = "Other Result"; 
        }; 
        break; 
        // and so 
      } 
      if (result != null && !errorCollection.ContainsKey(fieldName)) 
       errorCollection.Add(fieldName, result); 
      if (result == null && errorCollection.ContainsKey(fieldName)) 
       errorCollection.Remove(fieldName); 
      return result; 
     } 
    } 
} 

Pour le rendre agréable ajouter un peu de style à cibler le modèle d'erreur voir l'exemple

<Style TargetType="{x:Type TextBox}"> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border BorderBrush="Red" BorderThickness="1"> 
         <Grid> 
          <AdornedElementPlaceholder x:Name="MyAdorner"/> 
          <Image Width="{Binding AdornedElement.ActualHeight, ElementName=MyAdorner}" Margin="0" ToolTip="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=MyAdorner}" HorizontalAlignment="Right" VerticalAlignment="Center" Source="/Path/Exclamation.png" /> 
         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Je crois que ci-dessus fonctionne pour la validation au niveau de la cellule. pour ma validation multirow, j'ai trouvé ce poste, http://stackoverflow.com/questions/1729414/wpf-datagrid-how-to-validate-multiple-rows-and-mark-all-invalid-ones et aussi je combine validation au niveau de la cellule pour afficher les cellules invalides. désolé je ne peux pas marquer votre réponse comme une réponse, car il ne donne pas une solution correcte à mon problème. – Manohar

Questions connexes