我有一個WPF
應用程序(.Net 3.5
),它使用ViewModel上的IDataErrorInfo
來驗證輸入。IDataErrorInfo:如何知道所有屬性是否有效?
它工作得很好,usercontrol得到正確的UI反饋。
問題是用戶仍然可以更改所選元素或保存此元素。
所以我的問題是:我怎麼知道我的所有屬性都是有效的?或者至少我所有顯示的值都是有效的。目標是在此結果上綁定一些IsActive
我有一個WPF
應用程序(.Net 3.5
),它使用ViewModel上的IDataErrorInfo
來驗證輸入。IDataErrorInfo:如何知道所有屬性是否有效?
它工作得很好,usercontrol得到正確的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屬性。
我不知道是否有更好的解決方案?
令人討厭的是,每次發生屬性更改事件時都會使用反射.... –
如果您要走這條路線,請將靜態構造函數中存儲它的有效屬性名稱列表初始化爲靜態字段。那麼你只有反射發生一次 –
@BobVale是的,我也不爲此感到驕傲,但我更喜歡這樣做,以免有人忘記做一次檢查。很好,我會在一個靜態變量中初始化它。 – J4N
如果錯誤屬性不爲空或空那麼將會出現錯誤 –
你想知道它們是否全部有效?在View或ViewModel中? – Blachshma
我認爲這個答案可能會幫助你:http://stackoverflow.com/questions/104520/wpf-validation-for-the-whole-form –