2010-12-09 3 views
3

PropertyGrid을 구현했으며 선택한 개체의 속성 (다른 라이브러리에 있음)이 여기에 표시됩니다. 속성 값은 바인딩을 통해 PropertyGrid 컨트롤에 바인딩됩니다. 이제 사용자가 PropertyGrid 컨트롤 (주로 TextBox)에 입력 한 값에 대한 유효성 검사를 수행하고 값이 올바르지 않으면 사용자에게 메시지를 표시하려고합니다.WPF PropertyGrid에서 유효성 검사 구현

숫자 값, 필수 필드 등 비즈니스 로직 관련 유효성 검사와 같은 몇 가지 공통된 유효성 검사가 있습니다 (값은 이보다 더 클 수 없습니다).

구현하기 위해 사용할 수있는 방법은 무엇입니까 (IDataErrorInfo 또는 다른 것)?

답변

2

, 내가 표시 오류에 대해 매우 유용이 데이터 템플릿을 발견 :

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

그런 식으로, 당신은 단지 당신의 텍스트 상자 바인딩과에 ValidatesOnDataErrors=True을 설정해야 잘못된 것이 있으면 오류를 표시하는 툴팁을 얻으십시오. 그것은 다른 컨트롤에도 적용될 수 있습니다.

제대로 IDataErrorInfo를 구현하는 방법에 대한 자세한 내용은

, 이쪽을 봐 : http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx

특히 섹션을 살펴있다 "3.5 IDataErrorInfo 지원을"나는 최근에이 문제 그래서 나는 것 처리했다

+0

감사합니다. Botz, ViewModels에서 IDataErrorInfo를 구현 한 방법에 대한 몇 가지 코드를 제공해 주실 수 있습니까? 사실 내 경우에는 (UserControl에서 파생 된) 내 컨트롤에 종속성 속성이 있으므로 이러한 속성의 유효성을 검사해야합니다. – akjoshi

+0

구현 방법을 볼 수있는 링크가 추가되었습니다. – Botz3000

+0

어제 기사를 보았지만 상속 된 컨트롤을 사용하여 IDataErrorInfo를 구현하는 방법에 대해 혼란스러워합니다. BaseControl (몇 가지 일반적인 종속성 속성이 있음) 및 내 컨트롤이이 기본 컨트롤에서 상속되며 다른 종속성 속성이 있습니다. 모든 종속성 속성 (부모 + 자식)에 대한 유효성 검사를 수행해야합니다. – akjoshi

0

IDataErrorInfo을 사용하는 것이 좋습니다. 그러면 유효성 검사 논리는 ViewModel에 연결되고 UI에는 연결되지 않습니다. 그리고 WPF도 잘 지원합니다. 이미 ViewModels에 IDataErrorInfo을 구현 한 경우

1

동일한 문제를 가진 다른 사람들을 돕기 위해이 예제 코드를 게시하십시오.

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Text; 

namespace ValidationExample 
{ 

    public class SomeClass : DataErrorInfoImpl 
    { 
     [CustomValidation(typeof (SomeClassValidator), "ValidateSomeTextToValidate")] 
     string SomeTextToValidate {get;set;} 

    } 

    public class SomeClassValidator 
    { 
     public static ValidationResult ValidateNumberOfLevelDivisons(string text) 
     { 
      if (text != "What every condition i want") return new ValidationResult("Text did not meet my condition."); 
      return ValidationResult.Success; 
     } 

    } 

    public class DataErrorInfoImpl : IDataErrorInfo 
    { 
     string IDataErrorInfo.Error { get { return string.Empty; } } 

     string IDataErrorInfo.this[string columnName] 
     { 
      get 
      { 
       var pi = GetType().GetProperty(columnName); 
       var value = pi.GetValue(this, null); 

       var context = new ValidationContext(this, null, null) { MemberName = columnName }; 
       var validationResults = new List<ValidationResult>(); 
       if (!Validator.TryValidateProperty(value, context, validationResults)) 
       { 
        var sb = new StringBuilder(); 
        foreach (var vr in validationResults) 
        { 
         sb.AppendLine(vr.ErrorMessage); 
        } 
        return sb.ToString().Trim(); 
       } 
       return null; 
      } 
     } 
    } 
} 

이 스타일은 WPF Xceed.PropertyGrid 및 WPF PropertyTools.PropertyGrid에 작동합니다.