2009-06-16 8 views
7

J'ai un DataGrid WPF. Je lis un fichier csv et construis un ObservableCollection d'objets. J'ai défini DataGrid.ItemsSource sur la collection. Je voudrais alors forcer une RowValidation sur chaque ligne dans le DataGrid. Si je, en jouant l'utilisateur, édite une cellule, le RowValidation se déclenche, tout va bien. Mais la validation ne se déclenche pas sur la charge initiale. Y at-il un moyen que je peux appeler ?? ValidateRow ?? sur une rangée? à chaque rangée? (C#, WPF, VS2008, etc.)Validation forcée; WPF, DataGrid, ObservableCollection

Répondre

2

Pour vos liaisons, définissez UpdateSourceTrigger sur la propriété modifiée, puis placez vos règles de validation dans celle-ci. Le déclencheur de la source de mise à jour par défaut est Lost Focus.

<Binding Path="Name" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <ExceptionValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 

En outre, pour une autre bonne solution, un coup d'oeil ici

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

Paul construit un fournisseur d'erreur personnalisé, comme

Vous pouvez appeler la méthode validate() sur le ErrorProvider pour forcer la validation, et vérifier si les contrôles sont valables

1

Vous devez configurer un RowValidationRule et régler la ValidationStep = « ConvertedProposedValue » si vous voulez à valider après le chargement initial du ObservableCollection

 <DataGrid Name="dgCsvObjects" 
      ItemsSource="{Binding Path=CsvObjects}" 
      AutoGenerateColumns="False"> 
      <DataGrid.RowValidationRules> 
       <Validation:MyObjectValidationRule ValidationStep="ConvertedProposedValue" /> 
      </DataGrid.RowValidationRules> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Property1" Binding="{Binding Path=Property1}" /> 
       <DataGridTextColumn Header="Property2" Binding="{Binding Path=Property2}" /> 
       <DataGridTextColumn Header="Property3" Binding="{Binding Path=Property3}" /> 
       <DataGridTextColumn Header="Property4" Binding="{Binding Path=Property4}" /> 
      </DataGrid.Columns> 
     </DataGrid>