고유한 이름을 적용하는 ValidationRule
-
09-06-2019 - |
문제
특정 컬렉션의 컨텍스트 내에서 특정 속성이 고유하도록 적용하기 위해 사용자 지정 WPF ValidationRule을 작성하려고 합니다.예를 들어:ListView에 바인딩된 사용자 지정 개체 컬렉션을 편집하고 있으며 컬렉션에 있는 각 개체의 Name 속성이 고유한지 확인해야 합니다.이 작업을 수행하는 방법을 아는 사람이 있습니까?
해결책
먼저 컬렉션을 보관할 간단한 종속성 개체 클래스를 만듭니다.
class YourCollectionType : DependencyObject {
[PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList]
}
그런 다음 ValidationRule 파생 클래스에서 속성을 만듭니다.
YourCollectionType ListToCheck { get; set; }
그런 다음 XAML에서 다음을 수행합니다.
<Binding.ValidationRules>
<YourValidationRule>
<YourValidationRule.ListToCheck>
<YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" />
</YourValidationRule.ListToCheck>
</YourValidationRule>
</Binding.ValidationRules>
그런 다음 유효성 검사에서 유효성을 검사하는 항목에 대한 ListToCheck의 BoundList 속성 컬렉션을 살펴보세요.거기에 있으면 분명히 잘못된 유효성 검사 결과를 반환합니다.그렇지 않은 경우 true를 반환합니다.
다른 팁
규칙에 바인딩하려는 다른 속성이 있는 경우에만 사용자 지정 종속성 개체를 만들었습니다.이 경우 우리가 하는 일은 확인할 값의 단일 컬렉션을 연결하는 것뿐이므로 <UniqueValueValidationRule.OtherValues>
속성 a <CollectionContainer>
.
거기서부터 문제를 극복하기 위해 DataContext
상속받지 않고, <TextBox.Resources>
가지고 있어야합니다 <CollectionViewSource>
실제 바인딩을 유지하고 {StaticResource}
열쇠, 어느 OtherValues
그런 다음 바인딩 소스로 사용할 수 있습니다.
그러면 유효성 검사 규칙 자체는 루프스루만 하면 됩니다. OtherValues.Collection
그리고 동등성 검사를 수행합니다.
관찰하다:
<TextBox>
<TextBox.Resources>
<CollectionViewSource x:Key="otherNames" Source="{Binding OtherNames}"/>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="Name">
<Binding.ValidationRules>
<t:UniqueValueValidationRule>
<t:UniqueValueValidationRule.OtherValues>
<CollectionContainer Collection="{Binding Source={StaticResource otherNames}}"/>
</t:UniqueValueValidationRule.OtherValues>
</t:UniqueValueValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>