2012-12-24 12 views
19

Ho un oggetto del genere:Come utilizzare IDataErrorInfo.Error in un programma WPF?

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; 
     } 
    } 
} 

Binding la PersonName e le proprietà Age è facile:

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

Tuttavia, come posso utilizzare la proprietà di errore e di mostrare in modo appropriato?

+1

Ho finalmente trovato una soluzione alternativa e ho creato un post [qui] (http://www.cnblogs.com/guogangj/archive/2013/01/03/2843495.html). – guogangj

+6

La proprietà Error non è realmente utilizzata in WPF. Puoi anche lanciare una NotImplementedException. IDataErrorInfo è stato utilizzato da WPF "perché era già lì", ma solo per questa [] parte. Non è l'angolo più bello del WPF, penso. – Robin

+0

@Robin, potresti pubblicare una risposta a questa domanda. Sono passati 3-4 anni e non c'è una risposta accettata;) –

risposta

6

Ecco un esempio, tratto da this question, che dimostra come visualizzare l'errore in Tooltip:

<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

Salve, ho impostato un punto di interruzione su IDataErrorInfo.Error.get, ma non è mai stato attivato. Che cosa c'é? – guogangj

+1

@jgg - L'errore 'Errore' probabilmente non verrà richiamato in questo caso. Il 'IDataErrorInfo.this' get sarebbe, e sarebbe passato' 'PersonName" 'e' "Age" '. Quindi avresti bisogno di gestire entrambe le proprietà, ma al momento gestisci solo le prime. – CodeNaked

6

è necessario modificare lo stile TextBox in modo che mostra cosa c'è di sbagliato con la proprietà. Ecco un semplice esempio che mostra l'errore come tooltip:

<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> 

appena messo dentro Application.Resources dal file App.xaml e sarà applicato anche per ogni textbox della vostra applicazione:

<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> 
Problemi correlati