IDataErrorInfo的:如何知道是否所有属性都有效吗?(IDataErrorInfo : H

2019-07-04 05:02发布

我有一个WPF应用程序( .Net 3.5它使用) IDataErrorInfo上视图模型来验证输入。

它的伟大工程,在用户控件得到正确的UI反馈。

的问题是,用户仍然可以改变所选择的元素,或保存该元件。

所以我的问题是:我怎么能知道我所有的性质是有效的? 或者至少,我所有的显示值都是有效的。 我们的目标是一些绑定IsActive这一结果

Answer 1:

从你的实现您的评论IDataErrorInfo改变你实现这个风格....

#region IDataErrorInfo Members

public string Error
{
    get { return this[null] }
}

public string this[string columnName]
{
    get
    {
        StringBuilder result = new StringBuilder();
        if (string.IsNullOrEmpty(columnName) || columnName == "FirstName")
        {
            if (string.IsNullOrEmpty(FirstName))
                result.Append("Please enter a First Name\n");
        }
        if (string.IsNullOrEmpty(columnName) || columnName == "LastName")
        {
            if (string.IsNullOrEmpty(LastName))
                result.Append("Please enter a Last Name\n");
        }
       if (string.IsNullOrEmpty(columnName) || columnName == "Age")
        {
            if (Age < = 0 || Age >= 99)
                result.Append("Please enter a valid age\n");
        }
        return (result.Length==0) ? null : result.Remove(result.Length-1,1).ToString();
    }
}

#endregion


public bool IsValid {
   get { return string.IsNullOrEmpty(this.Error); }
}

然后在你的属性更改事件

if (e.PropertyName == "Error") {
   OnPropertyChanged(this,new PropertyChangedEventArgs("IsValid"));
}
if (e.PropertyName != "Error" && e.PropertyName != "IsValid") {
   OnPropertyChanged(this,new PropertyChangedEventArgs("Error"));
}


Answer 2:

现在,我在我的模型添加了此方法。

    public Boolean IsModelValid()
    {
        Boolean isValid = true;
        PropertyInfo[] properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (PropertyInfo p in properties)
        {
            if (!p.CanWrite || !p.CanRead)
            {
                continue;
            }
            if (this[p.Name] != null)
            {
                isValid = false;
            }
        }
        return isValid;
    }

我绑定的对象本身的PropertyChanged事件,

    public MyClassName()
    {
        PropertyChanged += CheckModelValidity;
        CheckModelValidity(null, null);
    }

当它改变,我把这种方法,如果结果比我的实际公共成员不同,我更新:

    private void CheckModelValidity(object sender, PropertyChangedEventArgs e)
    {
        bool isModelValid = IsModelValid();
        if(isModelValid!= IsValid)
        {
            IsValid = isModelValid;
        }
    }

然后,我可以只绑定IsValid属性。

我不知道是否有更好的解决办法?



文章来源: IDataErrorInfo : How to know if all properties are valid?