我已经实现了一个PropertyGrid
并且所选对象(在另一个库中)的属性显示在其中。属性值PropertyGrid
通过绑定绑定到控件。现在,我想对用户在PropertyGrid
控件中输入的值(主要是TextBox
)执行验证,如果值不正确,则向用户显示一条消息。
将有一些常见的验证,如数值、必填字段等和一些与业务逻辑相关的验证(如值不能超过这个等)。
有哪些方法可以实现这个(IDataErrorInfo
或其他)?
我已经实现了一个PropertyGrid
并且所选对象(在另一个库中)的属性显示在其中。属性值PropertyGrid
通过绑定绑定到控件。现在,我想对用户在PropertyGrid
控件中输入的值(主要是TextBox
)执行验证,如果值不正确,则向用户显示一条消息。
将有一些常见的验证,如数值、必填字段等和一些与业务逻辑相关的验证(如值不能超过这个等)。
有哪些方法可以实现这个(IDataErrorInfo
或其他)?
如果你已经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 支持”部分
我最近不得不处理这个问题,所以我将发布这个示例代码来帮助其他人解决同样的问题。
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。
我建议使用IDataErrorInfo
. 这样,验证逻辑将保持连接到ViewModel
而不是UI
. 并且WPF
对它也有很好的支持。