3

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

将有一些常见的验证,如数值、必填字段等和一些与业务逻辑相关的验证(如值不能超过这个等)。

有哪些方法可以实现这个(IDataErrorInfo或其他)?

4

3 回答 3

2

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

<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 支持”部分

于 2010-12-09T08:41:57.953 回答
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。

于 2014-07-17T02:33:58.450 回答
0

我建议使用IDataErrorInfo. 这样,验证逻辑将保持连接到ViewModel而不是UI. 并且WPF对它也有很好的支持。

于 2010-12-09T08:36:56.817 回答