Pregunta

Estoy intentando escribir una regla de validación de WPF personalizada para exigir que una determinada propiedad sea única dentro del contexto de una colección determinada.Por ejemplo:Estoy editando una colección de objetos personalizados vinculados a ListView y necesito asegurarme de que la propiedad Nombre de cada objeto de la colección sea única.¿Alguien sabe como hacer esto?

¿Fue útil?

Solución

Primero, crearía una clase DependencyObject simple para contener tu colección:

class YourCollectionType : DependencyObject {

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

}

Luego, en su clase derivada de ValidationRule, cree una propiedad:

YourCollectionType ListToCheck { get; set; }

Luego, en XAML, haz esto:

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

Luego, en su validación, mire la colección de la propiedad BoundList de ListToCheck para el elemento con el que está validando.Si está ahí, obviamente devolverá un resultado de validación falso.Si no es así, devuelve verdadero.

Otros consejos

Solo crearía un objeto de dependencia personalizado si hubiera otras propiedades que quisiera vincular a la regla.Dado que en este caso todo lo que estamos haciendo es adjuntar una única colección de valores para comparar, hice mi <UniqueValueValidationRule.OtherValues> propiedad una <CollectionContainer>.

A partir de ahí, para superar el problema de la DataContext no ser heredado, <TextBox.Resources> necesitaba tener un <CollectionViewSource> para mantener la encuadernación real y darle una {StaticResource} clave, que OtherValues luego podría usarse como fuente vinculante.

La regla de validación en sí misma sólo necesita recorrer OtherValues.Collection y realizar controles de igualdad.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top