ValidationRule Для принудительного применения уникального имени

StackOverflow https://stackoverflow.com/questions/34802

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top