2008-08-29 16 views
1

Ich versuche, eine benutzerdefinierte WPF ValidationRule zu schreiben, um zu erzwingen, dass eine bestimmte Eigenschaft innerhalb des Kontextes einer bestimmten Sammlung eindeutig ist. Beispiel: Ich bearbeite eine Sammlung von benutzerdefinierten Objekten, die an eine ListView gebunden sind, und ich muss sicherstellen, dass die Name-Eigenschaft jedes Objekts in der Auflistung eindeutig ist. Weiß jemand, wie man das macht?ValidationRule zum Erzwingen des eindeutigen Namens

Antwort

2

Zuerst würde ich eine einfache DependencyObject-Klasse erstellen Sie Ihre Sammlung zu halten:

class YourCollectionType : DependencyObject { 

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

} 

Dann auf Ihrem ValidationRule abgeleitete Klasse, erstellen Sie eine Eigenschaft:

YourCollectionType ListToCheck { get; set; } 

Dann in der XAML, tun Sie dies:

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

Dann in Ihrer Validierung, betrachten Sie ListToCheck BoundList Eigenschaft coll für den Gegenstand, gegen den Sie validieren. Wenn es da drin ist, gebe offensichtlich ein falsches Validierungsergebnis zurück. Wenn nicht, true zurück.

+1

Dies scheint nicht zu funktionieren, die Bindungs ​​Ergebnis immer Null ist (scheint nicht das Datacontext erben) –

+0

Du hast Recht. Die ValidationRule ist nicht Teil der visuellen Struktur und erbt daher den DataContext nicht. Es gibt schöne Artikel, die das Problem und die Lösungen dafür beschreiben [hier] (http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx) und [hier] (http://www.codeproject.com/KB/) WPF/ArtificialInheritanceCxt.aspx). –

0

Ich würde nur ein benutzerdefiniertes Abhängigkeitsobjekt erstellen, wenn andere Eigenschaften vorhanden wären, die ich an die Regel binden wollte. Da in diesem Fall nur eine einzige Sammlung von Werten angehängt wird, um sie zu überprüfen, habe ich meine <UniqueValueValidationRule.OtherValues> Eigenschaft zu <CollectionContainer> gemacht.

Von dort aus, vorbei an dem Problem der DataContext zu bekommen nicht vererbt werden, <TextBox.Resources> brauchte ein <CollectionViewSource> zu haben, um die tatsächliche Bindung zu halten und einen {StaticResource} Schlüssel geben, die OtherValues dann als Bindungsquelle nutzen könnten.

Die Validierungsregel selbst muss dann nur OtherValues.Collection durchlaufen und Gleichheitsprüfungen durchführen. Beachten Sie

:

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