Frage

Ich versuche, eine benutzerdefinierte WPF-Validierungsregel zu schreiben, um zu erzwingen, dass eine bestimmte Eigenschaft im Kontext einer bestimmten Sammlung eindeutig ist.Zum Beispiel:Ich bearbeite eine Sammlung benutzerdefinierter Objekte, die an eine ListView gebunden sind, und muss sicherstellen, dass die Name-Eigenschaft jedes Objekts in der Sammlung eindeutig ist.Weiß jemand, wie man das macht?

War es hilfreich?

Lösung

Zuerst würde ich eine einfache DependencyObject-Klasse erstellen, um Ihre Sammlung zu speichern:

class YourCollectionType : DependencyObject {

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

}

Erstellen Sie dann für Ihre von ValidationRule abgeleitete Klasse eine Eigenschaft:

YourCollectionType ListToCheck { get; set; }

Führen Sie dann im XAML Folgendes aus:

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

Sehen Sie sich dann bei Ihrer Validierung die Sammlung der BoundList-Eigenschaft von ListToCheck für das Element an, gegen das Sie validieren.Wenn es dort drin ist, wird offensichtlich ein falsches Validierungsergebnis zurückgegeben.Wenn nicht, geben Sie true zurück.

Andere Tipps

Ich würde nur dann ein benutzerdefiniertes Abhängigkeitsobjekt erstellen, wenn ich andere Eigenschaften an die Regel binden möchte.Da wir in diesem Fall lediglich eine einzelne Sammlung von Werten zur Prüfung anhängen, habe ich meine erstellt <UniqueValueValidationRule.OtherValues> Eigentum a <CollectionContainer>.

Von dort aus, um das Problem zu überwinden DataContext nicht vererbt werden, <TextBox.Resources> musste ein haben <CollectionViewSource> um die eigentliche Bindung zu halten und ihr eine zu geben {StaticResource} Schlüssel, der OtherValues könnte dann als verbindliche Quelle verwendet werden.

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

Beobachten:

    <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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top