Pregunta

Utilizo MVVM y mi objeto implementa IdataErrorInfo. Cuando se establece una propiedad, ejecuto métodos de validación personalizados y, si se pasa la validación, devuelvo String.empty, que establece validación.haserror en falso. Si la validación falla, Validation.hasError se establece en True. Tengo un estilo que uso para "controles requeridos" (controles que realizarán la validación) y establecen la información sobre herramientas del control a cualquiera que sea el error como este:

<Style x:Key="RequiredControl" TargetType="{x:Type Control}" >
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Y el ErrorConverter:

public class ZynErrorContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var errors = value as ReadOnlyObservableCollection<ValidationError>;
        if (errors == null) return "";

        return errors.Count > 0 ? errors[0].ErrorContent : "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

El problema es este: el usuario ingresa algo inválido ... y la validación. La información sobre herramientas se actualiza como se supone que debe. Si el usuario intenta corregir el error, pero ingresa un valor que causa un tipo diferente de invalidación, la información sobre herramientas debe mostrar la nueva cadena de error, pero esto no sucede. El error se muestra como el mismo error desde el primer error. Sé por qué sucede esto (creo) ... porque el desencadenante no se desencadena porque la validación. HASERROR nunca cambia de verdadero -> falso -> verdadero.

¿Alguien tiene alguna experiencia con este o algún consejo sobre cómo forzar el gatillo?

¿Fue útil?

Solución

Esta parece ser la respuesta: IdataErrorInfo con múltiples mensajes de error para una propiedad

Básicamente, se une al elemento actual y usa un ContentPresenter para mostrar el error. Funcionó para mi código.

Otros consejos

Creo que lo he descubierto. El culpable es el uso del convertidor. Estaba experimentando el mismo problema y el fragmento del código de problema era:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                        Path=(Validation.Errors), 
                        Converter={StaticResource validationErrorsToStringConverter }}"/>

Cambio el fragmento a:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
        Path=(Validation.Errors)[0].ErrorContent}"/>

y el problema se resolvió.

Conclusión: no use un convertidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top