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?

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top