Domanda

Io uso MVVM e il mio oggetto implementare IDataErrorInfo. Quando una proprietà è impostata, corro metodi di validazione personalizzati e se i passi di validazione, torno String.empty, che definisce Validation.HasError su false. Se la convalida non riesce, Validation.HasError è impostata su true. Ho uno stile che uso per "controlli necessari" (controlli che si esibiranno la validazione) e insieme è la descrizione comandi del controllo a tutto ciò che l'errore è in questo modo:

<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>

E l'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();
    }
}

Il problema è questo: L'utente inserisce qualcosa di non valido ... e il Validation.HasError è impostata su true. Il tooltip aggiorna come si suppone. Se i tentativi all'utente di correggere l'errore, ma entra un valore che determina un diverso tipo di invalidazione, il suggerimento dovrebbe mostrare la nuova stringa di errore, ma ciò non avviene. Gli spettacoli errore come lo stesso errore dal primo errore. Io so perché questo accade (credo) ... Perché il trigger non viene attivato in quanto il Validation.HasError non cambia mai da True -> False -.> True

Qualcuno ha qualche esperienza con questo o qualche consiglio su come forzare il grilletto?

È stato utile?

Soluzione

Questa sembra essere la risposta: IDataErrorInfo Con più messaggi di errore per una proprietà

In sostanza, si legano alla voce corrente e utilizzare un ContentPresenter per visualizzare l'errore. Ha funzionato per il mio codice.

Altri suggerimenti

credo di aver capito questo. Il colpevole è l'uso del convertitore. Stavo sperimentando lo stesso problema e il codice problema frammento di stato:

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

Ho cambiato il frammento di a:

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

e il problema è stato risolto.

Conclusione -. Non utilizzare un convertitore

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top