ValidationRule для каждого свойства, использующего отражение - PullRequest
0 голосов
/ 17 января 2019

Я думаю об использовании отражения в ValidationRule. Пользователь может вводить значения в WPF DataGrid, в то время как каждая ячейка DataGrid представляет свойства базовой модели (конечно).

Чтобы не проверять, содержит ли ячейка недопустимый символ (';') вручную с помощью оператора if для каждой ячейки (свойства), я собираюсь использовать это с помощью отражения. ... но как я могу получить тип используемого класса в BindigGroup? Это вообще возможно?

public class MyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)
    {
        BindingGroup group = (BindingGroup)value;
        StringBuilder error = null;
        foreach (var item in group.Items)
        {
            IDataErrorInfo info = item as IDataErrorInfo;
            if (info != null)
            {
                if (!string.IsNullOrEmpty(info.Error))
                {
                    if (error == null)
                    {
                        error = new StringBuilder();
                    }

                    Type type = typeof(MyClass);
                    PropertyInfo[] properties = type.GetProperties();
                    foreach (PropertyInfo property in properties)
                    {
                        Console.WriteLine(property.GetValue(property.Name, null));
                        if (property.GetValue(property.Name, null).ToString().Contains(";"))
                        {
                            error.Append(property.Name + " may not contain a ';'.");
                        }
                    }

                    error.Append((error.Length != 0 ? ", " : "") + info.Error);
                }
            }
        }

        if (error != null)
            return new ValidationResult(false, error.ToString());
        else
            return new ValidationResult(true, "");

    }
}

1 Ответ

0 голосов
/ 17 января 2019

Я нашел это решение:

Type type = item.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
    Console.WriteLine(property.GetValue(item));
    if ( property.GetValue(item).ToString().Contains(";") )
    {
        error.Append(property.Name + " may not contain a ';'.");
    }
}
...