WPF选项的验证

WPF选项的验证,wpf,data-annotations,inotifypropertychanged,idataerrorinfo,Wpf,Data Annotations,Inotifypropertychanged,Idataerrorinfo,我已经在网上坐了3个小时,没有什么帮助。 我正试图使用MVVM原则,按照以下要求在我的UI上实现验证 当前通过在我的模型上使用DataAnnotation: 例如: 1) 我只希望在单击按钮(提交)时进行验证 2) 如果我在UI上有5个验证,我也想在列表中显示它们 我研究了几种方法,但不确定使用哪种方法才能获得最适合我的2个要求的最佳实践: 伊丹弗罗 INotifyDataErrorInfo 数据注解?(目前的执行情况) 任何能给我指出正确方向的人,有什么建议吗?你应该阅读以下博文:。它提供了一

我已经在网上坐了3个小时,没有什么帮助。 我正试图使用MVVM原则,按照以下要求在我的UI上实现验证

当前通过在我的模型上使用DataAnnotation: 例如:

1) 我只希望在单击按钮(提交)时进行验证

2) 如果我在UI上有5个验证,我也想在列表中显示它们

我研究了几种方法,但不确定使用哪种方法才能获得最适合我的2个要求的最佳实践:

伊丹弗罗

INotifyDataErrorInfo

数据注解?(目前的执行情况)


任何能给我指出正确方向的人,有什么建议吗?

你应该阅读以下博文:。它提供了一个可以使用数据注释和
INotifyDataErrorInfo
界面实现验证的示例:

public class ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, ICollection<string>>
       _validationErrors = new Dictionary<string, ICollection<string>>();
    private readonly Model _user = new Model();

    public string Username
    {
        get { return _user.Username; }
        set
        {
            _user.Username = value;
            ValidateModelProperty(value, "Username");
        }
    }

    public string Name
    {
        get { return _user.Name; }
        set
        {
            _user.Name = value;
            ValidateModelProperty(value, "Name");
        }
    }

    protected void ValidateModelProperty(object value, string propertyName)
    {
        if (_validationErrors.ContainsKey(propertyName))
            _validationErrors.Remove(propertyName);

        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext validationContext =
            new ValidationContext(_user, null, null) { MemberName = propertyName };
        if (!Validator.TryValidateProperty(value, validationContext, validationResults))
        {
            _validationErrors.Add(propertyName, new List<string>());
            foreach (ValidationResult validationResult in validationResults)
            {
                _validationErrors[propertyName].Add(validationResult.ErrorMessage);
            }
        }
        RaiseErrorsChanged(propertyName);
    }

    protected void ValidateModel()
    {
        _validationErrors.Clear();
        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext validationContext = new ValidationContext(_user, null, null);
        if (!Validator.TryValidateObject(_user, validationContext, validationResults, true))
        {
            foreach (ValidationResult validationResult in validationResults)
            {
                string property = validationResult.MemberNames.ElementAt(0);
                if (_validationErrors.ContainsKey(property))
                {
                    _validationErrors[property].Add(validationResult.ErrorMessage);
                }
                else
                {
                    _validationErrors.Add(property, new List<string> { validationResult.ErrorMessage });
                }
            }
        }

        /* Raise the ErrorsChanged for all properties explicitly */
        RaiseErrorsChanged("Username");
        RaiseErrorsChanged("Name");
    }

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    private void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName)
            || !_validationErrors.ContainsKey(propertyName))
            return null;

        return _validationErrors[propertyName];
    }

    public bool HasErrors
    {
        get { return _validationErrors.Count > 0; }
    }
}
公共类视图模型:INotifyDataErrorInfo
{
专用只读词典
_validationErrors=新字典();
私有只读模型_user=new Model();
公共字符串用户名
{
获取{return\u user.Username;}
设置
{
_user.Username=值;
ValidateModelProperty(值,“用户名”);
}
}
公共字符串名
{
获取{return\u user.Name;}
设置
{
_user.Name=值;
ValidateModelProperty(值,“名称”);
}
}
受保护的void ValidateModelProperty(对象值、字符串propertyName)
{
if(_validationErrors.ContainsKey(propertyName))
_validationErrors.Remove(propertyName);
ICollection validationResults=新列表();
ValidationContext ValidationContext=
新的ValidationContext(_user,null,null){MemberName=propertyName};
if(!Validator.TryValidateProperty(值、validationContext、validationResults))
{
_添加(propertyName,new List());
foreach(ValidationResult ValidationResult in validationResults)
{
_validationErrors[propertyName].Add(validationResult.ErrorMessage);
}
}
RaiserRorschanged(propertyName);
}
受保护的void ValidateModel()
{
_validationErrors.Clear();
ICollection validationResults=新列表();
ValidationContext ValidationContext=新的ValidationContext(_user,null,null);
if(!Validator.TryValidateObject(_user,validationContext,validationResults,true))
{
foreach(ValidationResult ValidationResult in validationResults)
{
string属性=validationResult.MemberNames.ElementAt(0);
if(_validationErrors.ContainsKey(属性))
{
_validationErrors[property].Add(validationResult.ErrorMessage);
}
其他的
{
_Add(属性,新列表{validationResult.ErrorMessage});
}
}
}
/*明确提出所有属性的ErrorsAnged*/
RaiserRorschanged(“用户名”);
RaiseErrorsChanged(“名称”);
}
公共事件事件处理程序错误更改;
私有void raiserRorschanged(字符串属性名称)
{
if(ErrorsChanged!=null)
ErrorsChanged(这是新数据ErrorSchangedEventArgs(propertyName));
}
public System.Collections.IEnumerable GetErrors(字符串propertyName)
{
if(string.IsNullOrEmpty(propertyName)
||!\u validationErrors.ContainsKey(propertyName))
返回null;
返回_validationErrors[propertyName];
}
公共布尔错误
{
获取{return\u validationErrors.Count>0;}
}
}

您应该遵循一些教程,例如,本教程涵盖的基础非常好
public class ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, ICollection<string>>
       _validationErrors = new Dictionary<string, ICollection<string>>();
    private readonly Model _user = new Model();

    public string Username
    {
        get { return _user.Username; }
        set
        {
            _user.Username = value;
            ValidateModelProperty(value, "Username");
        }
    }

    public string Name
    {
        get { return _user.Name; }
        set
        {
            _user.Name = value;
            ValidateModelProperty(value, "Name");
        }
    }

    protected void ValidateModelProperty(object value, string propertyName)
    {
        if (_validationErrors.ContainsKey(propertyName))
            _validationErrors.Remove(propertyName);

        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext validationContext =
            new ValidationContext(_user, null, null) { MemberName = propertyName };
        if (!Validator.TryValidateProperty(value, validationContext, validationResults))
        {
            _validationErrors.Add(propertyName, new List<string>());
            foreach (ValidationResult validationResult in validationResults)
            {
                _validationErrors[propertyName].Add(validationResult.ErrorMessage);
            }
        }
        RaiseErrorsChanged(propertyName);
    }

    protected void ValidateModel()
    {
        _validationErrors.Clear();
        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext validationContext = new ValidationContext(_user, null, null);
        if (!Validator.TryValidateObject(_user, validationContext, validationResults, true))
        {
            foreach (ValidationResult validationResult in validationResults)
            {
                string property = validationResult.MemberNames.ElementAt(0);
                if (_validationErrors.ContainsKey(property))
                {
                    _validationErrors[property].Add(validationResult.ErrorMessage);
                }
                else
                {
                    _validationErrors.Add(property, new List<string> { validationResult.ErrorMessage });
                }
            }
        }

        /* Raise the ErrorsChanged for all properties explicitly */
        RaiseErrorsChanged("Username");
        RaiseErrorsChanged("Name");
    }

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    private void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName)
            || !_validationErrors.ContainsKey(propertyName))
            return null;

        return _validationErrors[propertyName];
    }

    public bool HasErrors
    {
        get { return _validationErrors.Count > 0; }
    }
}