2010-07-28 8 views
0

오류를 반환하는 유효성 검사 규칙을 얻으려고합니다. IDataErrorInfo를 구현 한 모델에 내 비즈니스 개체 속성과 이벤트 유효성 검사 실패시 반환 할 메시지가 포함되어 있습니다. 또한 유효성 검사 규칙을 만들었습니다. 문제는 유효성 검사 규칙이 실행 중 (책갈피가 지정됨)이지만 IDataErrorInfo 구현에서 내 모델을 생성하더라도 규칙의 IDataErrorInfo 참조에 오류가 발생하지 않는다는 것입니다. DataGrid는 유효성 검사에 실패했음을 분명히 보여줍니다.유효성 검사 규칙에 문제가 있습니다.

규칙과 모델이 두 가지 다른 메시지를 반환하도록 테스트 한 결과 모델의 버전이 항상 반환됩니다. 그것은 내 규칙이 IDataErrorInfo 객체에 무엇이 있는지를 볼 수 없거나 단지 그것의 새로운 인스턴스를 만드는 것과 같습니다.

데이터 그리드 :

<DataGrid ItemsSource="{Binding Path=ProjectExpenseItemsCollection}" AutoGenerateColumns="False" 
    Name="dgProjectExpenseItems" RowStyle="{StaticResource RowStyle}" 
    SelectedItem="{Binding Path=SelectedProjectExpenseItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    CanUserDeleteRows="True" CanUserAddRows="True"> 
    <DataGrid.RowValidationRules> 
     <vr:RowDataInfoValidationRule ValidationStep="UpdatedValue" /> 
    </DataGrid.RowValidationRules> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Item Number" 
      Binding="{Binding ItemNumber, Mode=TwoWay, 
      UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> 
    </DataGrid.Columns> 
</DataGrid> 

검증 규칙 :

목적 "이데이는"null이 아니라, idei.Error는 항상 길이가 0 인 문자열 ("")

입니다
public class RowDataInfoValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     BindingGroup bindingGroup = (BindingGroup)value; 
     IDataErrorInfo idei = bindingGroup.Items[0] as IDataErrorInfo; 
     string error = (idei != null) ? idei.Error : null; 
     return (string.IsNullOrEmpty(error)) ? ValidationResult.ValidResult : new ValidationResult(false, error + ": ValidationRule"); 
    } 
} 

모델/비즈니스 오브젝트 :

public class ProjectExpenseItemsBO : IDataErrorInfo, IEditableObject, INotifyPropertyChanged 
{ 
    public string ItemNumber { get; set; } 

    public ProjectExpenseItemsBO() {} 

    // string method 
    static bool IsStringMissing(string value) 
    { 
     return String.IsNullOrEmpty(value) || value.Trim() == String.Empty; 
    } 

    #region IDataErrorInfo Members 

    public string Error 
    { 
     get { return this[string.Empty]; } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      string result = string.Empty; 
      if (propertyName == "ItemNumber") 
      { 
       if (IsStringMissing(this.ItemNumber)) 
       { 
        result = "Item number cannot be empty-IDataError!"; 
       } 
      } 

      return result; 
     } 
    } 

    #endregion 
} 

답변

1

규칙이 가져 오는 IDataErrorInfo 개체는 ProjectExpenseItemsBO 개체의 인스턴스입니다. 확인한 유일한 속성은 오류입니다.이 문자열은 this[string.Empty]을 반환하기 위해 구현했으며, 항상 string.Empty를 반환합니다. 아마도 개체의 모든 오류를 살펴보기 위해 Error 속성의 구현을 변경하거나 RowDataInfoValidationRule에 속성을 반복하고 인덱서를 통해 오류 메시지를 가져 오려고 할 것입니다.

ItemNumber에 대한 바인딩에서 ValidatesOnDataErrors가 True로 설정되어 있으므로 프레임 워크에서 ItemNumber 속성 이름을 사용하여 인덱서를 호출하고 오류 메시지를 표시하므로 모델에서 유효성 검사 오류가 발생합니다.

+0

그것은 총체적인 감각을 만든다. 그리고 나는 그것을 보지 않고 조금 어리 석다 고 느낀다. (newbee). 오류를 전달하는 데 필요한 코드를 추가했는데 작동 중입니다! 두 번째 대답은 내 VR이 오류에 액세스 할 수 있지만 dg는 여전히 메시지 및 유효성 검사 결과에 대한 모델의 IDEI를 찾고 있습니까? 이 경우 IDEI를 재정의하는 규칙을 어떻게 얻을 수 있습니까? 오류가 수정되었을 때 VR에서 유효성 검사 오류를 지우려면 VR을 가져 오려고하지만 dg를 정렬하거나 새로 고치면 수행 할 수 있습니다. VR이 결과를 ValidResult로 설정하면 오류를 해결할 수 있다고 생각했습니다. 안녕, 고마워! – steveareeno

+0

무엇인가를 수정합시다. 필자는 실제로 테스트 목적이었던 IDEI의 오류를 무시하고 싶지는 않습니다. 사용자가 오류를 수정했을 때 그리드의 유효성 검사 오류를 명확히하고 싶습니다. 또는 dg를 새로 고칩니다. – steveareeno

+0

좋아, 이제 알았다. 내 dg의 열에 ValidatesOnDataErrors가 true로 설정되어 있기 때문에 VR의 결과를 무시합니다. 난 칼럼에서 그것을 제거하고 모든 지금은 잘 작동합니다. 나는 그것들을 서로 결합하여 사용할 수있을 것이라고 생각했지만, 그것은 어느 것이 든/또는 하나 인 것처럼 보입니다. 이는 수정되었을 때 dg에서 오류를 지우는 것에 관한 것이 었습니다. 이 경우, VR이 할 수 있고 IDEI는 적어도 dg를 새로 고치지 않고는 불가능합니다. – steveareeno

관련 문제