Pergunta

A validação do Silverlight usando INotifyDataErrorInfo estava funcionando muito bem com suas exibições de erros inteligentes até que comecei a tentar usá-lo em TextBoxes vinculadas a propriedades de tipos de dados não string.Meu plano era usar os setters das propriedades para fazer a lógica de validação, adicionando e removendo erros conforme necessário.Funciona muito bem em TextBoxes que são strings, mas se você tiver um TextBox vinculado a um Int e inserir uma string, o setter nem mesmo será chamado (onde eu seria capaz de adicionar um erro que obviamente valores não numéricos são inválido).Qual é o curso de ação sugerido a partir daqui?Examinei os ValueConverters, mas eles estão muito separados da lógica INotifyDataErrorInfo na minha classe que está sendo validada.

exemplo hipotético:

public class MyClass
{
    private string _prod;
    public string Prod
    {
        get { return _prod; }
        set //This works great
        {
            if (value.Length > 15)
            {
                AddError("Prod", "Cannot exceed 15 characters", false);
            }
            else if (value != _prod)
            {
                RemoveError("Prod", "Cannot exceed 15 characters");
                _prod= value;
            }
        }
    }

    private int _quantity;
    public int Quantity
    {
        get { return _quantity; }
        set //if a string was entered into the textbox, this setter is not called.
        {
            int test;
            if (!int.TryParse(value, test))
            {
                AddError("Quantity", "Must be numeric", false);
            }
            else if (test != _quantity)
            {
                RemoveError("Quantity", "Must be numeric");
                _quantity= test;
            }
        }
    }

    protected Dictionary<String, List<String>> errors = 
        new Dictionary<string, List<string>>();

    public void AddError(string propertyName, string error, bool isWarning)
    {
        //adds error to errors
    }
    public void RemoveError(string propertyName, string error)
    {
        //removes error from errors
    }

    //INotifyDataErrorInfo members...
}
Foi útil?

Solução

Eu sugiro que você vincule o valor do TextBox a um valor de string de qualquer maneira e faça a validação lá.No caso de uma validação bem-sucedida, passe o valor para outra propriedade com o tipo de dados que você realmente está procurando (por exemplo,interno).Em qualquer outro caso, falhe na validação.Apenas uma solução alternativa ...mas funciona para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top