在WPF PropertyGrid中实现验证

时间:2010-12-09 08:24:48

标签: .net wpf validation propertygrid idataerrorinfo

我已经实现了PropertyGrid,并且在其中显示了所选对象(在另一个库中)的属性。属性值通过绑定绑定到PropertyGrid控件。现在,我想对用户在PropertyGrid控件中输入的值(主要是TextBox)执行验证,并在值不正确时向用户显示消息。

会有一些常见的验证,例如数值,必填字段等以及一些与业务逻辑相关的验证(比如值不能超过此等)。

有哪些方法可用于实现此目标(IDataErrorInfo或其他方式)?

3 个答案:

答案 0 :(得分:2)

如果您已经在ViewModel上实现了IDataErrorInfo,我发现此数据模板对于显示错误非常有用:

<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 :(得分:1)

我最近不得不处理这个问题所以我会发布这个示例代码来帮助其他人解决同样的问题。

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。

答案 2 :(得分:0)

我建议使用IDataErrorInfo。这样,验证逻辑保持附加到ViewModel而不是UIWPF也很好地支持它。