2008-08-29 3 views
1

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

ответ

2

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

После этого в вашей проверке посмотрите на свойство свойства ListDoCheck's BoundList для элемента, с которым вы проверяете. Если он там, очевидно, вернет результат ложной проверки. Если это не так, верните true.

+1

Это не похоже на работу, связывающая результат всегда пустой (кажется, не наследует DataContext) – 2010-05-04 05:46:29

0

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