2009-06-16 10 views
7

Ho un DataGrid WPF. Ho letto un file CSV e ho creato una ObservableCollection di oggetti. Ho impostato DataGrid.ItemsSource sulla raccolta. Vorrei quindi forzare una RowValidation su ogni riga in DataGrid. Se io, giocando utente, modifica una cella, la RowValidation si attiva, tutto va bene. Ma la convalida non si attiva sul carico iniziale. C'è un modo in cui posso chiamare ValidateRow ?? di fila? su ogni fila? (C#, WPF, VS2008, ecc.)forzatura di convalida; WPF, DataGrid, ObservableCollection

risposta

2

Per i binding, impostare UpdateSourceTrigger su proprietà modificate e quindi inserire le regole di convalida al suo interno. Il trigger di origine dell'aggiornamento predefinito è Lost Focus.

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

Inoltre, per un'altra buona soluzione, date un'occhiata qui

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

Paul costruisce un provider di errore personalizzato, come

È possibile chiamare il metodo validate() sul l'ErrorProvider per forzare la convalida, e verificare se i controlli sono validi

1

dovrai impostare un RowValidationRule e impostare il ValidationStep = "ConvertedProposedValue" se si desidera per convalidare dopo il caricamento iniziale di 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>