2012-12-24 32 views
19

tôi có một đối tượng như thế:Cách sử dụng IDataErrorInfo.Error trong chương trình 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; 
     } 
    } 
} 

Ràng buộc các PERSONNAME và tài sản Tuổi rất dễ dàng:

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

Tuy nhiên, làm thế nào tôi có thể sử dụng tài sản Lỗi và hiển thị nó một cách thích hợp?

+1

Cuối cùng tôi đã tìm thấy cách giải quyết và tôi đã đăng một bài đăng [ở đây] (http://www.cnblogs.com/guogangj/archive/2013/01/03/2843495.html). – guogangj

+6

Thuộc tính Lỗi không thực sự được sử dụng trong WPF. Bạn thậm chí có thể ném một NotImplementedException trong đó. IDataErrorInfo đã được WPF sử dụng "bởi vì nó đã có sẵn", nhưng chỉ cho phần [] này. Không phải là góc đẹp nhất của WPF, tôi nghĩ vậy. – Robin

+0

@Robin, bạn có thể đăng câu trả lời cho câu hỏi này. Nó được như 3-4 năm và không có câu trả lời được chấp nhận;) –

Trả lời

6

Dưới đây là một ví dụ, chuyển thể từ this question, cho thấy làm thế nào để hiển thị lỗi trong 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

Xin chào, tôi đã đặt một điểm ngắt tại IDataErrorInfo.Error.get, nhưng nó không bao giờ được kích hoạt. Có chuyện gì vậy? – guogangj

+1

@jgg - Lỗi 'có thể sẽ không được gọi trong trường hợp này. 'IDataErrorInfo.this' nhận được, và sẽ được thông qua' "PersonName" 'và' "Age" '. Vì vậy, bạn sẽ cần phải xử lý cả hai thuộc tính, nhưng ngay bây giờ bạn chỉ xử lý trước đây. – CodeNaked

6

Bạn nên thay đổi phong cách TextBox để nó cho thấy những gì xảy ra với tài sản. Dưới đây là một ví dụ đơn giản mà hiển thị lỗi như 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> 

Chỉ cần đặt nó bên Application.Resources từ file App.xaml của bạn và nó sẽ được aplied cho mỗi textbox của ứng dụng của bạn:

<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> 
Các vấn đề liên quan