我有一个WPF
应用程序( .Net 3.5
它使用) IDataErrorInfo
上视图模型来验证输入。
它的伟大工程,在用户控件得到正确的UI反馈。
的问题是,用户仍然可以改变所选择的元素,或保存该元件。
所以我的问题是:我怎么能知道我所有的性质是有效的? 或者至少,我所有的显示值都是有效的。 我们的目标是一些绑定IsActive
这一结果
我有一个WPF
应用程序( .Net 3.5
它使用) IDataErrorInfo
上视图模型来验证输入。
它的伟大工程,在用户控件得到正确的UI反馈。
的问题是,用户仍然可以改变所选择的元素,或保存该元件。
所以我的问题是:我怎么能知道我所有的性质是有效的? 或者至少,我所有的显示值都是有效的。 我们的目标是一些绑定IsActive
这一结果
从你的实现您的评论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"));
}
现在,我在我的模型添加了此方法。
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属性。
我不知道是否有更好的解决办法?