2015-07-15 17 views
6

Utilizzando un DataGrid in WPF, sto cercando di ottenere un comportamento corretto durante l'utilizzo della convalida degli errori tramite INotifyDataErrorInfo.Errore di convalida riga DataGrid WPF non cancellato dopo la modifica

Possiedo una ObservableCollection di una classe che implementa tale interfaccia, un binding alla raccolta di DataGrid. Quando c'è un errore, la cella avrà un bordo rosso e la riga avrà un rosso! di fronte. Tutto predefinito, tutto bene. Quando si modifica ancora, quando l'errore è scomparso, il bordo rosso e il rosso! entrambi spariranno. Fin qui tutto bene!

Tuttavia, quando esco dalla riga (tramite tastiera Enter/Tab o con il mouse), quindi tornare indietro e quindi rimuovere l'errore, il bordo del globulo rosso scompare, ma il rosso! soggiorni.

Sono consapevole che questa domanda è stata sollevata prima, ad esempio qui: WPF DataGrid validation errors not clearing. Tuttavia, le soluzioni non risolvono questo problema, oltre a nascondere del tutto l'errore di convalida delle righe. (Che, in combinazione con qualcosa come la seconda risposta here è anche abbastanza ok ...)

Oppure il mio problema è piuttosto che l'utente è in grado di lasciare la modalità di modifica della cella anche se c'è un errore di validazione? Preferibilmente, vorrei limitarlo e forzare prima la risoluzione dell'errore, prima che possa verificarsi un ulteriore editing, ma non so come farlo senza un sacco di codice ...

Ecco l'XML (il RowValidationErrorTemplate viene da qui: link):

<UserControl x:Class="CustomDG" 
      ...etc... 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      d:DataContext="{d:DesignInstance Type=viewmodels:TestViewModel}"> 
    <Grid> 
     <DataGrid 
      ItemsSource="{Binding Path=testCollection}" AutoGenerateColumns="False" 
      RowHeight="18" CanUserResizeRows="False" RowHeaderWidth="18" > 
      <DataGrid.RowValidationErrorTemplate> 
       <ControlTemplate> 
       <Grid Margin="0,-2,0,-2" 
        ToolTip="{Binding RelativeSource={RelativeSource 
        FindAncestor, AncestorType={x:Type DataGridRow}}, 
        Path=(Validation.Errors)[0].ErrorContent}"> 
        <Ellipse StrokeThickness="0" Fill="Red" 
         Width="{TemplateBinding FontSize}" 
         Height="{TemplateBinding FontSize}" /> 
        <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" 
         FontWeight="Bold" Foreground="White" 
         HorizontalAlignment="Center" /> 
        </Grid> 
       </ControlTemplate> 
      </DataGrid.RowValidationErrorTemplate>--> 

      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Path=Name, 
        ValidatesOnNotifyDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > 
       </DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</UserControl> 

risposta

3

è necessario aumentare notifyPropertyChanged con stringa vuota dopo fila commesso o modificare annullata per aggiornare la DataBinding da oggetto e questo sarà rinfrescare la vostra interfaccia di usarlo così:

RaiseNotifyPropertyChanged("");