Validação do datagrid do wpf de entrada

estou a tentar validar a entrada que é introduzida no Datagrid no WPF.

Adicionei uma regra de validação ao XAML.

a entrada é mais um objecto do que uma cadeia ou int. Embora o método que uso espere um objecto.

Como posso resolver o problema e fazê-lo funcionar com um int ou string. A entrada só pode ser um int entre 1 e 20.

XAML:

<DataGridTextColumn Header="Niveau">                                
    <DataGridTextColumn.Binding>                                                                 
        <Binding Path="Niveau" UpdateSourceTrigger="LostFocus">
            <Binding.ValidationRules>                                       
                <valRule:NiveautredeValidationRule  />                                             
            </Binding.ValidationRules>
        </Binding>                                          
    </DataGridTextColumn.Binding>                                               
</DataGridTextColumn>

C#

public class NiveautredeValidationRule : ValidationRule
{
    public override System.Windows.Controls.ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        NiveaudoelenViewModel doel = (value as BindingGroup).Items[0] as NiveaudoelenViewModel;
        if (doel.Niveau <= 0 || doel.Niveau > 20)
        {
            return new System.Windows.Controls.ValidationResult(false, "Niveau moet tussen de 1 en 20 zijn!");
        }
        else
        {
            return System.Windows.Controls.ValidationResult.ValidResult;
        }
    }
}
 0
Author: Rand Random, 2018-01-17

2 answers

Podes tentar isto:

public override System.Windows.Controls.ValidationResult Validate(object value, 
    System.Globalization.CultureInfo cultureInfo)
{
    int myInt = 0;

    try
    {
        if (((string)value).Length > 0)
            myInt = int.Parse((String)value);
    }
    catch (Exception e)
    {
        return new ValidationResult(false, "Illegal characters or " + e.Message);
    }

    if (myInt < 0 || myInt > 20)
    {
        return new ValidationResult(false,
          "Please enter a number in the range: 0 - 20");
    }
    else
    {
        return new ValidationResult(true, null);
    }
}

Fonte: https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-binding-validation

 1
Author: Atlasmaybe, 2018-01-17 14:09:08

Você deve considerar a actualização da resposta aceptada a isto, isto elimina o try catch e usa TryParse em vez de

public override System.Windows.Controls.ValidationResult Validate(object value, 
    System.Globalization.CultureInfo cultureInfo)
{
    int myInt;
    if (!int.TryParse(System.Convert.ToString(value), out myInt))
        return new ValidationResult(false, "Illegal characters");

    if (myInt < 0 || myInt > 20)
    {
        return new ValidationResult(false, "Please enter a number in the range: 0 - 20");
    }
    else
    {
        return new ValidationResult(true, null);
    }
}
 1
Author: Rand Random, 2018-01-23 11:56:55