2013-03-04 110 views
3

在我目前的項目中,我必須處理WPF表單中的數據驗證。我的表單位於ResourceDictionnary的DataTemplate中。我可以保存和加載我的表單中的數據,這要歸功於兩個按鈕,它們對數據進行序列化和反序列化(通過兩個DelegateCommand)。WPF驗證錯誤

如果我的表單的一個字段爲空或無效,保存按鈕將被禁用。由於UpdateSourceTrigger屬性,每次更改字段時都會檢查它。這就是爲什麼我需要在我的C#代碼中知道一個字段是否無效以更新我的保存命令。

目前,我在我的XAML綁定中使用了ExceptionValidationRule,我不知道這是否是一個很好的實踐。我無法實現ValidationRule,因爲我需要在C#代碼中知道字段是否無效,以更新保存命令(啓用或禁用保存按鈕)。

<TextBox> 
    <Binding Path="Contact.FirstName" UpdateSourceTrigger="PropertyChanged"> 
     <Binding.ValidationRules> 
      <ExceptionValidationRule/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox> 

在這個blog,我們可以看到:

在二傳手提高例外是不是一個很好的方法,因爲這些屬性也可以通過代碼設定,有時它是確定暫時離開他們錯誤值。

我已經閱讀了這個post但我不能使用它,我的TextBox在DataTemplate中,我不能在我的C#代碼中使用它們。

所以,我不知道是否應該更改我的數據驗證,並且不要使用ExceptionValidationRule。

+0

你嘗試IDataErrorInfo的和MVVM? – blindmeis 2013-03-04 10:41:00

+0

是的,我已經使用MVVM。 IDataErrorInfo似乎是一個很好的解決方案...它會比ExceptionValidationRule更好嗎? – Max 2013-03-04 10:56:33

+1

我會說是的,但它也有它的缺點。特別是如果您的vw中的屬性的類型不是字符串。我們在我們的項目中使用idataerrorinfo並且它可以工作 – blindmeis 2013-03-04 11:42:38

回答

5

謝謝blindmeis,你的想法很好。 IDataErrorInfo似乎比ExceptionValidationException更好,它的工作原理。

以下爲符合我的項目,它的例子: IDataErrorInfo sample

它不使用DelegateCommand但是是很簡單的修改。您的模型必須實現IDataErrorInfo的:

public class Contact : IDataErrorInfo 
{ 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public string Name { get; set; } 

    public string this[string property] 
    { 
     get 
     { 
      string result = null; 
      if (property== "Name") 
      { 
       if (string.IsNullOrEmpty(Name) || Name.Length < 3) 
        result = "Please enter a Name"; 
      } 
      return result; 
     } 
    } 

} 

在XAML代碼,不要忘了更改綁定:

<TextBox> 
    <Binding Path="Contact.Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/> 
</TextBox>