2008-08-29 14 views
1

J'essaie d'écrire une règle de validation personnalisée WPF pour appliquer qu'une certaine propriété est unique dans le contexte d'une collection donnée. Par exemple: Je suis en train d'éditer une collection d'objets personnalisés liés à un ListView et je dois m'assurer que la propriété Name de chaque objet de la collection est unique. Est-ce que quelqu'un sait comment faire ça?ValidationRule pour appliquer un nom unique

Répondre

2

D'abord, je voudrais créer une simple classe DependencyObject pour tenir votre collection:

class YourCollectionType : DependencyObject { 

    [PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList] 

} 

Ensuite, sur votre classe dérivée ValidationRule, créer une propriété:

YourCollectionType ListToCheck { get; set; } 

Puis, dans la XAML, faites ceci:

<Binding.ValidationRules> 
    <YourValidationRule> 
     <YourValidationRule.ListToCheck>  
      <YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" /> 
     </YourValidationRule.ListToCheck> 
    </YourValidationRule> 
</Binding.ValidationRules> 

Ensuite, dans votre validation, regardez la propriété BoundList de la liste ListToCheck ection pour l'objet contre lequel vous validez. Si c'est là, évidemment renvoyer un faux résultat de validation. Si ce n'est pas le cas, retournez vrai.

+1

Cela ne (semble ne pas hériter du DataContext) semblent ne pas travailler, le résultat est toujours nul liaison –

+0

Vous avez raison. La ValidationRule ne fait pas partie de l'arborescence visuelle et n'hérite donc pas du DataContext. Il y a de bons articles décrivant le problème et des solutions pour cela [ici] (http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx) et [ici] (http://www.codeproject.com/KB/ WPF/ArtificialInheritanceCxt.aspx). –

0

Je créerais seulement un objet de dépendance personnalisé s'il y avait d'autres propriétés que je voulais lier à la règle. Puisque dans ce cas tout ce que nous faisons est de joindre une seule collection de valeurs à vérifier, j'ai fait ma propriété <UniqueValueValidationRule.OtherValues> un <CollectionContainer>.

De là, pour dépasser le problème de la DataContext ne pas être hérité, <TextBox.Resources> nécessaire d'avoir un <CollectionViewSource> pour maintenir la liaison et de donner une réelle clé {StaticResource}, qui OtherValues pourrait alors utiliser comme source de liaison.

La règle de validation elle-même n'a plus besoin que d'effectuer une boucle sur OtherValues.Collection et d'effectuer des vérifications d'égalité.

Observe:

<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>