2010-10-03 58 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