ValidationRule per applicare il nome univoco
-
09-06-2019 - |
Domanda
Sto cercando di scrivere una ValidationRule WPF personalizzata per imporre che una determinata proprietà sia univoca nel contesto di una determinata raccolta.Per esempio:Sto modificando una raccolta di oggetti personalizzati associati a ListView e devo assicurarmi che la proprietà Name di ciascun oggetto nella raccolta sia univoca.Qualcuno sa come fare questo?
Soluzione
Innanzitutto, creerei una semplice classe DependencyObject per contenere la tua raccolta:
class YourCollectionType : DependencyObject {
[PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList]
}
Quindi, nella classe derivata da ValidationRule, crea una proprietà:
YourCollectionType ListToCheck { get; set; }
Quindi, in XAML, esegui questa operazione:
<Binding.ValidationRules>
<YourValidationRule>
<YourValidationRule.ListToCheck>
<YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" />
</YourValidationRule.ListToCheck>
</YourValidationRule>
</Binding.ValidationRules>
Quindi, nella convalida, esamina la raccolta della proprietà BoundList di ListToCheck per l'elemento rispetto al quale stai convalidando.Se è lì, ovviamente restituisce un risultato di convalida falso.Se non lo è, restituisce true.
Altri suggerimenti
Creerei un oggetto di dipendenza personalizzato solo se ci fossero altre proprietà che volevo associare alla regola.Poiché in questo caso tutto ciò che stiamo facendo è allegare una singola raccolta di valori da confrontare, ho creato my <UniqueValueValidationRule.OtherValues>
proprietà A <CollectionContainer>
.
Da lì, per superare il problema del DataContext
non essere ereditato, <TextBox.Resources>
necessario avere un <CollectionViewSource>
per tenere l'associazione effettiva e dargli a {StaticResource}
chiave, che OtherValues
potrebbe quindi essere utilizzato come fonte vincolante.
La regola di convalida stessa deve quindi solo passare in rassegna OtherValues.Collection
ed eseguire controlli di uguaglianza.
Osservare:
<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>