ValidationRule для принудительного применения уникального имени - PullRequest
1 голос
/ 29 августа 2008

Я пытаюсь написать пользовательский WPF ValidationRule, чтобы обеспечить уникальность определенного свойства в контексте данной коллекции. Например: я редактирую коллекцию пользовательских объектов, привязанных к ListView, и мне нужно убедиться, что свойство Name каждого объекта в коллекции уникально. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

2 голосов
/ 29 августа 2008

Во-первых, я бы создал простой класс 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.

1 голос
/ 27 октября 2017

Я бы только создал пользовательский объект зависимости, если бы были другие свойства, которые я хотел бы связать с правилом. Так как в этом случае все, что мы делаем, это прикрепляем одну коллекцию значений для проверки, я сделал свое свойство <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...