2017-06-30 7 views
0

Ich bin neu in WPF, derzeit Validation lernen. In meinem einfachen Beispiel habe ich diese Modellklasse:ValidatesOnExceptions Konflikte mit ValidatesOnDataErrors

class Book 
{ 
    public int Id 
      { 
       get { return id; } 
       set 
       { 
        if (id == value) return; 
        id = value; 
        OnPropertyChanged(nameof(Id)); 
       } 
      } 

      public string Title 
      { 
       get { return title; } 
       set 
       { 
        if (title == value) return; 
        title = value; 
        OnPropertyChanged(nameof(Title)); 
        OnPropertyChanged(nameof(PagesCount)); 
       } 
      } 
      public int PagesCount 
      { 
       get { return pagesCount; } 
       set 
       { 
        if (pagesCount == value) return; 
        pagesCount = value; 
        OnPropertyChanged(nameof(Title)); 
        OnPropertyChanged(nameof(PagesCount)); 
       } 
      } 
      public string Color 
      { 
       get { return color; } 
       set 
       { 
        if (color == value) return; 
        color = value; 
        OnPropertyChanged(nameof(Color)); 
       } 
      } 
} 

I IDataErorInfo und INotifyDataErorInfo umgesetzt. einer meiner Validierungsregeln (zum Testen Sake Autor) ist, dass der Benutzer nicht beide SS in Titel und 33 in PagesCount eingeben kann, so fügte ich dies in den INotifyDataErrorInfo ‚s Indexer:

case nameof(Title): 
         if (Title == "N") 
         { 
          AddError(nameof(Title), "Annoying"); 
          hasError = true; 
         } 
         if (Title == "SS" && PagesCount == 33) 
         { 
          AddError(nameof(Title), "SS and 33 not compatible"); 
          hasError = true; 
         } 
         if (!hasError) 
          ClearErrors(nameof(Title)); 
         break; 
        case nameof(PagesCount): 
         if (Title == "SS" && PagesCount == 33) 
         { 
          AddError(nameof(Title), "SS and 33 not compatible"); 
          hasError = true; 
         } 
         if (!hasError) 
          ClearErrors(nameof(Title)); 

         break; 

Als ich eingeben diese Werte (SS für Titel und 33 für PagesCount) die rote Umrandung angezeigt, und die Fehlermeldung zeigen in dieser Vorlage:

<ListBox Grid.Row="8" Grid.ColumnSpan="2" ItemsSource="{Binding ElementName=mGrd, Path=(Validation.Errors)}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <ListBox ItemsSource="{Binding Path=ErrorContent}"/> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

aber wenn ich geben Sie einen ungültigen Wert für die PagesCount (ungültige int) wie 33e t Die Fehlermeldung verschwindet nicht aus der ListBox, und der Rahmen schmückt weiterhin beide Textfelder. Ich weiß nicht, warum es nicht die Fehlermeldung aus der Fehlervorlage löscht und nur den roten Rahmen behält, also gibt es eine Möglichkeit, dies zu tun, und kann ich auch Nachricht für solche Ausnahmen anzeigen (Eingabe 33e für int Feld)

+0

Warum verschwindet der Rahmen, wenn Sie einen * ungültigen * Wert eingeben? – mm8

Antwort

0

Einstellung der ValidatesOnExceptions Eigenschaft auf true ist die Abkürzung für das hinzufügen der eingebauten in ExceptionValidationRule zur ValidationRules Kollektion Bindung:

<TextBox> 
    <TextBox.Text> 
     <Binding Path="Age" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <ExceptionValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

Was dies bedeutet ist, dass es ein ValidationError Objekt in die Validation.Errors Sammlung wird wenn beim Setzen eine Ausnahme ausgelöst wird ting die Quelleigenschaft (Age in diesem Fall). Dies führt dazu, dass Validation.ErrorTemplate des Elements (TextBox) angezeigt wird.

Und da kann man nie eine int Eigenschaft auf „33e“, weil diese keine gültige int Wert ist, wird es in der Tat eine Ausnahme in diesem Fall geworfen werden.

+0

Es passiert nichts. Gibt es zusätzliche Arbeit an der Vorlage für Fehlermeldungen? –

+0

Ich habe auch eine interessante Sache gefunden: wenn ich einen ungültigen Wert eingegeben habe, werden weder der Property Setter noch der Indexer aufgerufen! –

+0

Dies wird erwartet. Wie ich Ihnen schon gesagt habe, können Sie eine int-Eigenschaft nicht auf einen anderen Wert als int setzen. – mm8