최근까지 IDataErrorInfo
인터페이스의 사용자 지정 확장 버전을 사용했습니다. 내 확장 기능을 사용하면 여러 오류를 동시에 처리 할 수 있으며 지금까지는 나에게 매우 도움이되었습니다. 그러나 INotifyDataErrorInfo
인터페이스가 도입됨에 따라 나는 어떤 개선이 있었는지 확인하기 위해 실험을해볼 것이라고 생각했습니다.ValidationAttribute 및 INotifyDataErrorInfo를 사용하여 다른 속성의 유효성을 검사 할 때 하나의 속성에서 유효성 검사를 트리거하는 방법
몇 가지 온라인 자습서를 수행 한 후 System.ComponentModel.DataAnnotations namespace
에서 다양한 ValidationAttribute
을 사용하고 있습니다. 이 Attribute
S를 사용하면 다음과 같은 기본 유효성 검사 규칙을 제공하자 오류 메시지가 바로 적용 ErrorTemplate
의에서 사용할 수있는 Valaidation.Errors
수집에 연결로
[MinLength(3, ErrorMessage = "Name must be longer than 3 characters.")]
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); Validate("Name", name); }
}
초기에는 꽤 좋은 것 같았다. 그러나 내장 된 유효성 검사 규칙의 대부분은 실제로 기본이며 다른 속성 값과 관련된 복잡한 유효성 검사 규칙을 구현해야하는 데 익숙합니다.
그래서 여러 속성과 관련된 간단한 유효성 검사 규칙을 만드는 방법을 알아 보았습니다. 두 개 이상의 필드 중 하나를 설정해야한다는 규칙. 그래서 ValidationAttribute
을 확장 한 클래스를 선언하고 온라인 검색을 한 후에 다른 속성 값에 액세스하는 방법을 찾았습니다.
내가 데이터 바인딩 속성에 대한 Validation.Errors
수집 표시된 각 TextBox
에 적용되는 사용자 정의 ErrorTemplate
와 기본 UI 노크 다음 Name
재산에 내 사용자 지정 Attribute
세트
<ControlTemplate x:Key="ErrorTemplate">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="#4FFF0000" BorderThickness="1" Margin="0,10">
<AdornedElementPlaceholder />
</Border>
<Image Name="WarningImage" Source="pack://application:,,,/WpfApplication1;component/Images/Warning_16.png" Margin="5,0,0,0" Tag="{Binding}" />
<Popup PlacementTarget="{Binding ElementName=WarningImage}" Placement="Right" Margin="5,0,0,0" AllowsTransparency="True" IsOpen="True">
<Border BorderThickness="1" BorderBrush="#4FFF0000" CornerRadius="5" Background="White" Padding="5" Margin="10">
<Border.Effect>
<DropShadowEffect Color="Red" Opacity="0.5" BlurRadius="15" ShadowDepth="0" />
</Border.Effect>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
</StackPanel>
</ControlTemplate>
을, 나는에 관리 속성을 설정하지 않았 으면 ValidationResult
을 Validation.Errors
컬렉션에 추가합니다. 그러나 여기에 문제가 있습니다. 다른 특정 속성에 바인딩 된 TextBox
데이터 중 하나에 값을 추가하면 처음에는 오류 메시지가 표시됩니다. TextBox
woul 거기에있어.
처음으로 TextBox
으로 가서 뭔가를 입력하면 유효성 검사가 작동하므로 값을 삭제하더라도 필수 속성 중 하나가 설정되었음을 여전히 알고있었습니다. 따라서 유효성 검사 코드는 작동하지만 문제는 다른 필수 속성의 속성 변경으로 Name
속성의 유효성 검사가 트리거되지 않는다는 것입니다.
다른 필수 속성에 동일한 사용자 지정 Attribute
을 적용한 경우에도 똑같은 문제가 발생했습니다. 각 유효성 검사 오류는 해당 TextBox
을 입력 할 때만 사라집니다. 나는 또한 CustomValidationAttribute
에 빌드를 시도했는데, 이는 우리가 클래스의 메서드를 호출하여 유효성을 검사 할 수있게했지만 최종 결과는 동일했습니다.
유효성 검사 코드는 작동하지만 다른 필수 속성 변경으로 인해 트리거되지 않습니다. 나는 심지어 Validate
메서드를 호출하여 다른 속성의 이름을 전달하려고 시도했지만 연속 루프에서 끝났다. 질문은 다른 속성의 유효성을 검사 할 때 한 속성의 유효성 검사를 어떻게 트리거 할 수 있습니까?
동일한 샘플을 게시 할 수 있습니까? 나는 그것을 보는 것에 흥미가있다. – pushpraj
와우 ...이 질문은 이미 충분히 길지 않은가요? 나는 온라인에서 모든 것을 얻었습니다 ... 당신은 무엇을보고 싶습니까? 아마도 당신에게 몇 가지 링크를 제공 할 수 있습니까? – Sheridan
질문에는 동일한 내용을 이해할 수있는 충분한 세부 정보가 있습니다. 예제 코드를 모두 작성하여 동일한 코드를 다시 작성하지 않아도되고 문제를 직접 해결할 수 있습니다. – pushpraj