ValidationRule Для принудительного применения уникального имени
-
09-06-2019 - |
Вопрос
Я пытаюсь написать пользовательское правило проверки WPF, чтобы обеспечить уникальность определенного свойства в контексте данной коллекции.Например:Я редактирую коллекцию пользовательских объектов, привязанных к ListView, и мне нужно убедиться, что свойство Name каждого объекта в коллекции уникально.Кто-нибудь знает, как это сделать?
Решение
Во-первых, я бы создал простой класс DependencyObject для хранения вашей коллекции:
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>
свойство а <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>