2013-11-27 100 views
0

我使用IDataError來驗證我的控件和文本框中的對象屬性。 在我的課上,我添加了一些驗證,然後我將綁定添加到文本框控件。IDataErrorInfo和非空屬性綁定驗證

這是我的課:

public class Customer : IDataErrorInfo 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public long TributaryCode { get; set; } 

     #region IDataErrorInfo Members 

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

     public string this[string columnName] 
     { 
      get 
      { 
       string result = null; 
       if (columnName == "FirstName") 
       { 
        if (string.IsNullOrEmpty(FirstName)) 
         result = "Please enter a First Name"; 
       } 
       if (columnName == "LastName") 
       { 
        if (string.IsNullOrEmpty(LastName)) 
         result = "Please enter a Last Name"; 
       } 
       return result; 
      } 
     } 

     #endregion 
    } 

有我可是問題是,當TributaryCode是空的,我得到的說,它無法轉換值「」異常。這是明顯拋出的,因爲tributarycode很長並且不支持空值。 此外,當包含文本框的用戶控件加載時,該值顯示爲0.我想要的是以空爲開始,當文本框爲空時,不拋出該異常。

那麼,我需要做什麼?我必須將所有屬性寫爲空嗎?這些類然後轉化爲請求WCF服務的類,所以這是一個可能的解決方案,但我想問一下這是否正確。

另外,正如我所說的,所有這些控件都在UserControl中。我有一個窗口包含一個包含此UserControl的ScrollViewer。 驗證是在文本框的LostFocus事件中完成的,但由於某種原因,當窗口加載並加載UserControl時,我所有的空文本框都已經有紅色邊框,表示它沒有通過驗證。 爲什麼會發生這種情況?我想這一定是與UserControl項目有關。

這是我的文本框XAML之一:

<TextBox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1" 
    Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName, 
      ValidatesOnDataErrors=true, NotifyOnValidationError=true}" /> 

謝謝!

回答

1

你正在經歷的是一切正常。

問題I'm有是,當TributaryCode是空的,我得到的說,它無法轉換值'

如果你感到困擾的例外,你有解決方案的數量;您可以使用0初始化該值;您可以添加一個PreviewKeyDown處理程序以僅允許long值;你可以使用一個nullable long

public long? TributaryCode { get; set; } 

當窗口加載並加載用戶控件,我所有的空文本框已經在紅色邊框表明它didn't通過驗證

再次,這是正常的......當物業沒有價值時,你還期望發生什麼?這稱爲預測驗證,用戶在之前會提示他們嘗試保存的錯誤。就我個人而言,我更喜歡這個系統,因爲用戶總是知道他們能做什麼,不能做什麼。

+0

謝謝你的回答。我已經「屏蔽了」TributaryCode文本框來限制用戶只允許使用數字。我想知道如果解決方案是使用很長時間?而不是長。然後,關於驗證,我認爲文本框驗證它什麼時候聚焦然後失去焦點。不在初始化時。當他甚至沒有嘗試完成一個窗口時,我不喜歡用戶打開一個窗口並看到一個帶有紅色邊框的文本框的窗口。你明白我的意思嗎? – Andres

+0

您可以嘗試在每個TextBox控件上將'Binding.UpdateSourceTrigger'更改爲'LostFocus',它應該*延遲'Binding'更新直到'TextBox'失去焦點,但我不能保證那樣做將刪除啓動驗證錯誤。 – Sheridan

+0

是的,我做到了。我的問題中的XAML代碼顯示了它。我確信這種行爲不會發生在窗口中。將不得不檢查。 – Andres