2015-07-15 5 views
6

Mit einem DataGrid in WPF versuche ich, korrektes Verhalten zu erhalten, während ich die Fehlerüberprüfung über INotifyDataErrorInfo verwende.WPF DataGrid-Zeilenüberprüfungsfehler, der nach der Bearbeitung nicht gelöscht wird

Ich habe eine ObservableCollection einer Klasse, die diese Schnittstelle implementiert, eine Bindung dieser Auflistung an das DataGrid. Wenn ein Fehler auftritt, hat die Zelle einen roten Rand und die Zeile wird rot sein! vor. Alles Standard, alles gut. Wenn der Fehler noch nicht behoben ist, wird der rote Rand und rot! werden beide verschwinden. So weit, ist es gut!

Wenn ich jedoch die Zeile verlasse (über die Tastatur Enter/Tab oder mit der Maus), dann komm zurück und entferne dann den Fehler, der rote Zellenrand verschwindet, aber der rote! bleibt.

Ich bin mir bewusst, dass diese Frage schon einmal aufgeworfen wurde, zum Beispiel hier: WPF DataGrid validation errors not clearing. Die Lösungen lösen dies jedoch nicht, abgesehen davon, dass der Zeilenvalidierungsfehler vollständig ausgeblendet wird. (Was, in Kombination mit etwas wie der zweiten Antwort here ist auch ganz in Ordnung ...)

Oder ist mein Problem eher, dass der Benutzer den Bearbeitungsmodus der Zelle verlassen kann, obwohl es einen Validierungsfehler gibt? Am liebsten würde ich das beschränken und zuerst die Auflösung des Fehlers erzwingen, bevor eine weitere Bearbeitung erfolgen kann, aber ich weiß nicht, wie man dies ohne viel Code erzwingen kann ...

Hier ist das XML (die RowValidationErrorTemplate kommt von hier: 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> 

Antwort

3

Sie notifyPropertyChanged mit leeren String nach Zeile begangen oder abgebrochen bearbeiten zu aktualisieren, das Databinding von Objekt, und dies wird aktualisieren Sie Ihre Schnittstelle es so verwenden erhöhen müssen:

RaiseNotifyPropertyChanged(""); 
Verwandte Themen