2010-10-03 59 views
0

我在我的SL4應用程序中有一個類,代表用戶輸入數據的單個實體。我正在做數據驗證如下:Silverlight:在驗證錯誤時禁用按鈕? (麻煩驗證)

private double cost; 
    public string Cost 
    { 
     get 
     { 
      return String.Format("{0}{1}", DOLLAR_SYMBOL, cost); 
     } 
     set 
     { 
      string price = getPriceFromCost(value); 
      if (!double.TryParse(price, out cost)) 
      { 
       throw new ArgumentException("Please enter a number."); 
      } 

      OnPropertyChanged("Cost"); 
     } 
    } 

這很好。但是,如果用戶輸入一個有效值,然後是無效值,忽略驗證錯誤並點擊提交,則將使用舊的有效值創建實體。我寧願強迫用戶糾正錯誤。我怎樣才能禁用「添加」按鈕?

另外,我想在用戶點擊添加按鈕時進行一些其他形式的驗證,但我仍然希望文本輸入框的高亮效果以紅色突出顯示,並彈出消息。我怎樣才能做到這一點而不扔ArgumentExceptions

回答

0

您可以在拋出異常的同時切換bool,並將Button的IsEnabled綁定到該bool。

您幾乎可以使用WCF RIA Services執行任何驗證任務 - 我建議您從Jeff Handleys最新的博客帖子開始,並從此處開始。 http://jeffhandley.com/archive/2010/09/22/RiaServicesStandardValidators.aspx

+0

右鍵定義IsEnabled屬性,但不會我需要爲每個驗證領域的布爾? 「IsValidName」,「IsValidDate」等。如果用戶未能設置「Date」的輸入,我不想再次啓用按鈕,直到對該字段提供有效輸入。 – 2010-10-03 17:08:11

+0

這是一個非常有用的博客文章。我在我的數據實體類的幾個屬性中添加了[[必需]]。但是,前端沒有任何事情發生。我怎樣才能使這個驗證發生? – 2010-10-03 17:16:05

0

一個簡單的解決方案將遵循這個forum thread所說的。如果您僅使用例外進行輸入驗證,則需要在控件的綁定中設置NotifyOnValidationError=True,然後將在您的控件的BindingValidationError事件中宣佈任何錯誤。

如果您使用的是Silverlight 4,那麼使用INotifyDataErrorInfo當然更好。

0
  1. 您需要View Model中的一個屬性來存儲Button的IsEnabled屬性的狀態(您需要在XAML中綁定此屬性)。
  2. 您現在需要創建一個委託+事件來檢測和引發CostChange事件。
  3. 在視圖模型,訂閱此事件,並在1