2015-07-15 24 views
6

Użycie DataGrid w WPF, próbuję uzyskać prawidłowe zachowanie podczas korzystania z sprawdzania błędów za pośrednictwem INotifyDataErrorInfo.Błąd sprawdzania poprawności wiersza datagrid WPF nie po wyczyszczeniu

Posiadam ObservableCollection klasy, która implementuje ten interfejs, powiązanie kolekcji z DataGrid. Kiedy wystąpi błąd, komórka będzie miała czerwoną granicę, a rząd będzie miał czerwony! z przodu. Wszystko domyślnie, wszystko dobrze. Podczas edycji, gdy błąd zniknie, czerwona ramka i czerwona! oba znikną. Jak na razie dobrze!

Jednak po wyjściu z rzędu (za pomocą klawiatury Enter/Tab lub za pomocą myszy), wróć do niego, a następnie usuń błąd, znika czerwona ramka, ale czerwona! gorset.

Zdaję sobie sprawę, że to pytanie zostało poruszone wcześniej, na przykład tutaj: WPF DataGrid validation errors not clearing. Jednak rozwiązania tam nie rozwiązują tego problemu, poza całkowitym ukrywaniem błędu sprawdzania poprawności wiersza. (Które, w połączeniu z czymś podobnym do drugiej odpowiedzi, here jest również całkiem w porządku ...)

Czy mój problem polega raczej na tym, że użytkownik może wyjść z trybu edycji komórki, mimo że istnieje błąd sprawdzania poprawności? Najlepiej, chciałbym ograniczyć to i wymuszam najpierw rozdzielczość błędu, zanim może się zdarzyć dalsza edycja, ale nie wiem jak to wymusić bez mnóstwa kodu ...

Oto XML (RowValidationErrorTemplate pochodzi stąd: 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> 

Odpowiedz

3

trzeba podnieść notifyPropertyChanged z pustym ciągiem po wierszu popełnione lub anulowane edycji odświeżyć DataBinding Address i to odświeży twój interfejs używać go tak:

RaiseNotifyPropertyChanged("");