Реализация проверок в WPF PropertyGrid - PullRequest
3 голосов
/ 09 декабря 2010

Я реализовал PropertyGrid, и в нем отображаются свойства выбранного объекта (в другой библиотеке).Значения свойств привязаны к PropertyGrid элементам управления через привязку.Теперь я хочу выполнить проверку значений, которые пользователь вводит в PropertyGrid элемент управления (в основном TextBox), и отобразить сообщение для пользователя, если значение неверно.

Будут некоторые распространенные проверки, такие как числовые значения,обязательное поле и т. д. и некоторые проверки, связанные с бизнес-логикой (например, значение не может быть больше этого и т. д.).

Какие есть все подходы для реализации этого (IDataErrorInfo или что-то еще)?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Если вы уже внедрили IDataErrorInfo в своих ViewModels, я нашел этот шаблон данных весьма полезным для отображения ошибок:

<Style TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
        </Trigger>
    </Style.Triggers>
</Style>

Таким образом, вам нужно только установить ValidatesOnDataErrors=True наваши текстовые привязки, и вы получите всплывающую подсказку, отображающую ошибку, если что-то не так.Это может быть применено и к другим элементам управления.

Для получения информации о том, как правильно реализовать IDataErrorInfo, посмотрите здесь:
http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx
особенно посмотрите на раздел " 3.5 Поддержка IDataErrorInfo "

1 голос
/ 17 июля 2014

Мне недавно пришлось столкнуться с этой проблемой, поэтому я опубликую этот пример кода, чтобы помочь другим с этой же проблемой.

using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace ValidationExample
{

    public class SomeClass : DataErrorInfoImpl
    {
        [CustomValidation(typeof (SomeClassValidator), "ValidateSomeTextToValidate")]
        string SomeTextToValidate {get;set;}

    }

    public class SomeClassValidator
    {
        public static ValidationResult ValidateNumberOfLevelDivisons(string text)
        {
            if (text != "What every condition i want") return new ValidationResult("Text did not meet my condition.");
            return ValidationResult.Success;
        }

    }

    public class DataErrorInfoImpl : IDataErrorInfo
    {
        string IDataErrorInfo.Error { get { return string.Empty; } }

        string IDataErrorInfo.this[string columnName]
        {
            get
            {
                var pi = GetType().GetProperty(columnName);
                var value = pi.GetValue(this, null);

                var context = new ValidationContext(this, null, null) { MemberName = columnName };
                var validationResults = new List<ValidationResult>();
                if (!Validator.TryValidateProperty(value, context, validationResults))
                {
                    var sb = new StringBuilder();
                    foreach (var vr in validationResults)
                    {
                        sb.AppendLine(vr.ErrorMessage);
                    }
                    return sb.ToString().Trim();
                }
                return null;
            }
        }
    }
}

Этот стиль должен работать в WPF Xceed.PropertyGrid и WPF PropertyTools.PropertyGrid.

0 голосов
/ 09 декабря 2010

Я рекомендую использовать IDataErrorInfo.Таким образом, логика проверки остается присоединенной к ViewModel, а не к UIWPF также имеет хорошую поддержку.

...