Pergunta

Estou tentando escrever uma ValidationRule WPF personalizada para garantir que uma determinada propriedade seja exclusiva no contexto de uma determinada coleção.Por exemplo:Estou editando uma coleção de objetos personalizados vinculados a um ListView e preciso garantir que a propriedade Name de cada objeto na coleção seja exclusiva.Alguém sabe como fazer isso?

Foi útil?

Solução

Primeiro, eu criaria uma classe DependencyObject simples para armazenar sua coleção:

class YourCollectionType : DependencyObject {

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

}

Em seguida, na sua classe derivada de ValidationRule, crie uma propriedade:

YourCollectionType ListToCheck { get; set; }

Então, no XAML, faça o seguinte:

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

Em seguida, em sua validação, observe a coleção da propriedade BoundList de ListToCheck para o item que você está validando.Se estiver lá, obviamente retorne um resultado de validação falso.Se não for, retorne verdadeiro.

Outras dicas

Eu só criaria um objeto de dependência personalizado se houvesse outras propriedades que eu desejasse vincular à regra.Como neste caso tudo o que estamos fazendo é anexar uma única coleção de valores para verificar, fiz meu <UniqueValueValidationRule.OtherValues> propriedade um <CollectionContainer>.

A partir daí, para superar o problema do DataContext não sendo herdado, <TextBox.Resources> precisava ter um <CollectionViewSource> para manter a ligação real e dar-lhe um {StaticResource} chave, que OtherValues poderia então usar como fonte de ligação.

A própria regra de validação precisa apenas fazer um loop OtherValues.Collection e realizar verificações de igualdade.

Observar:

    <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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top