2012-12-24 14 views
19

Mam obiekt tak:Jak korzystać z IDataErrorInfo.Error w programie 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; 
     } 
    } 
} 

Związanie PERSONNAME i właściwości wiek jest łatwe:

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

jednak, w jaki sposób mogę skorzystać z właściwości błąd i pokazać go odpowiednio?

+1

W końcu znalazłem obejście i napisałem post [tutaj] (http://www.cnblogs.com/guogangj/archive/2013/01/03/2843495.html). – guogangj

+6

Właściwość Error nie jest tak naprawdę używana w WPF. Można nawet rzucić tam wyjątek NotImplementedException. IDataErrorInfo zostało użyte przez WPF "ponieważ już tam było", ale tylko dla tej części []. Nie myślę, że nie najładniejszy zakątek WPF. – Robin

+0

@Robin, możesz opublikować odpowiedź na to pytanie. To było jak 3-4 lata i nie ma akceptowanej odpowiedzi;) –

Odpowiedz

6

Oto przykład, zaadaptowany z this question, który pokazuje w jaki sposób wyświetlać błąd w 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

Witam, ustawiam punkt przerwania na IDataErrorInfo.Error.get, ale nigdy nie jest on wyzwalany. O co chodzi? – guogangj

+1

@jgg - "Błąd" prawdopodobnie nie zostanie wywołany w tym przypadku. "IDataErrorInfo.this" otrzyma i zostanie przekazany '" PersonName "' i '" Age "'. Będziesz więc musiał obsługiwać obie właściwości, ale w tej chwili obsługujesz tylko te pierwsze. – CodeNaked

6

należy zmodyfikować styl TextBox więc to pokazuje, co się dzieje z nieruchomości. Oto prosty przykład, który pokazuje błąd jako podpowiedzi:

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

wystarczy umieścić go wewnątrz Application.Resources z pliku App.xaml i będzie aplikowany dla każdego pola tekstowego swojej aplikacji:

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