2012-12-24 11 views
19

Ich habe ein Objekt wie folgt aus:Wie IDataErrorInfo.Error in einem WPF-Programm verwenden?

public class Person : IDataErrorInfo 
{ 
    public string PersonName{get;set;} 
    public int Age{get;set;} 

    string IDataErrorInfo.this[string propertyName] 
    { 
     get 
     { 
      if(propertyName=="PersonName") 
      { 
       if(PersonName.Length>30 || PersonName.Length<1) 
       { 
        return "Name is required and less than 30 characters."; 
       } 
      } 
      return null; 
     } 
    } 

    string IDataErrorInfo.Error 
    { 
     get 
     { 
      if(PersonName=="Tom" && Age!=30) 
      { 
       return "Tom must be 30."; 
      } 
      return null; 
     } 
    } 
} 

die Personname und Alter Eigenschaften Bindung leicht:

<TextBox Text="{Binding PersonName, ValidatesOnDataErrors=True}" /> 
<TextBox Text="{Binding Age, ValidatesOnDataErrors=True}" /> 

Doch wie kann ich den Fehler Eigenschaft verwenden und entsprechend zeigen? Hier

+1

Ich habe endlich einen Workaround gefunden und einen Post [hier] (http://www.cnblogs.com/guogangj/archive/2013/01/03/2843495.html) erstellt. – guogangj

+6

Die Fehlereigenschaft wird in WPF nicht wirklich verwandt. Sie könnten sogar eine NotImplementedException dort hineinwerfen. IDataErrorInfo wurde von WPF verwendet, "weil es bereits dort war", aber nur für den this [] -Teil. Nicht die schönste Ecke von WPF, denke ich. – Robin

+0

@Robin, Sie könnten eine Antwort auf diese Frage schreiben. Es war wie 3-4 Jahre und es gibt keine akzeptierte Antwort;) –

Antwort

6

ist ein Beispiel, adaptiert von this question, das zeigt, wie in Tooltip den Fehler anzuzeigen:

<TextBox> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="true"> 
        <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=(Validation.Errors)[0].ErrorContent}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

Hallo, ich habe einen Breakpoint bei IDataErrorInfo.Error.get gesetzt, aber es wird nie ausgelöst. Was ist los? – guogangj

+1

@jgg - Der 'Fehler' wird wahrscheinlich in diesem Fall nicht aufgerufen. Das 'IDataErrorInfo.this' get würde und würde" PersonName "und" Age "übergeben. Sie müssten also beide Eigenschaften handhaben, aber im Moment behandeln Sie nur die ersteren. – CodeNaked

6

Sie sollten den TextBox Stil ändern, so zeigt es, was mit der Eigenschaft falsch ist. Hier ist ein einfaches Beispiel, das den Fehler als Tooltip zeigt:

<Style TargetType="TextBox"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
      </Trigger> 
     </Style.Triggers> 
</Style> 

einfach legt es in Application.Resources von Ihrer app.xaml Datei und es wird für jede Textbox Ihrer Anwendung aplied werden:

<Application.Resources> 
    <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="true"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, 
          Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
       </Trigger> 
      </Style.Triggers> 
    </Style> 
</Application.Resources>