2010-01-12 62 views
4

我在屏幕上有两个文本框,一个是'从数量'另一个'数额'。验证规则是 '金额'应小于'金额'。WPF验证问题:如何使用涉及2个字段的验证工作

现在我的问题是,当用户输入'金额'大于'金额'的一对金额时, 如何使两个文本框显示为红色边框。当用户通过“从量”减少或增加“达”校正量(或者 ,如何使两者的文本框中显示不 错误的外观?

感谢

我的代码看起来是这样的:

public partial class Rate : IDataErrorInfo 
{ 
    public Rate() 
    { 
     is_active = true; 
     registered = DateTime.Now; 
    } 

    #region FOR validation 

    public string Error 
    { 
     get 
     { 
      var properties = this.GetType().GetProperties(); 
      foreach (var propertyInfo in properties) 
      { 
       string err = this[propertyInfo.Name]; 
       if (!string.IsNullOrEmpty(err)) 
       { 
        return err; 
       } 
      } 
      return string.Empty; 
     } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      string result = null; 

      if (result == null && "from_amt" == propertyName) 
      { 
       if (from_amt > to_amt) 
       { 
        result = Resources.Validation.Rate_from_amount_value; 
       } 
      } 

      if (result == null && "to_amt" == propertyName) 
      { 
       if (from_amt > to_amt) 
       { 
        result = Resources.Validation.Rate_to_amount_value; 
       } 
      } 

      return result; 
     } 
    } 
    #endregion 


} 

}

+0

的[使用来自另一控制值验证规则]可能的复制(http://stackoverflow.com/questions/18554019/validation-rules-using-value-from-another-control) – Dzyann 2015-12-15 12:36:14

回答

1

当我验证依赖,而不是强调对另一个文本框的值,一个文本框,就像你提到我拦截值变化并接受或拒绝更改。

我发现如果我尝试根据对文本框的更改来更改文本框B我总是遇到问题,但是如果我接受或拒绝对文本框B的更改(基于文本框B中的值),它可以正常工作。

编辑:

我假设你正在处理的纯数字文本框。如果是这种情况,我建议你做我所做的事情。首先,对于我的验证规则,我创建了一个表示数字约束的多边形,这使您可以在两个值之间建立线性关系。然后,无论何时更改一个值,我都会检查当前数据点是否与验证多边形相交。如果数据点位于多边形之外,则不允许进行更改。

您遇到的问题是,如果您处于多边形的边缘,则该值似乎“卡住”。为了解决这个问题,我创建了一个图形,用它显示当前点的验证多边形。这样,如果用户将一个值推到极限,他们可以明白为什么他们不能再改变。

为了更好的衡量,我沿着绘图的每个轴添加了滑动条,以便它们可以轻松更改值,并且我已经添加了拖动功能。

通过这种方式,您可以获得稳定的验证,并且用户非常清楚如何更改这些值以及为什么他们不能超出某些限制。

+0

由于埃里克为你的答案。我的客户希望垃圾更宽容的选择,以便她可以调整from_amt和to_amt。继续使用WPF提供的验证架构将会很好。 – 2010-01-14 05:15:20

+0

在上面的评论中增加了更多内容。 – Eric 2010-01-15 00:18:15

0

查看与其接受的答案类似的SO问题。基本上,解决方案可能是为每个属性的设置者的两个属性引发属性更改通知,以便在更改任何属性时重新验证它们。

Validate control manually in WPF

+0

我试图在OnPropertyChange处理程序中引发属性更改通知,因为这样:当更改的字段是“from_amt”时,引发“to_amt”,此类工作。 但是当我在“to_amt”改变时增加了一段代码来提高“from_amt”时,我得到了堆栈溢出异常。 – 2010-01-14 05:04:24

+0

显示from_amt'和'to_amt'的'set'访问器的代码并显示异常的详细信息。 – 2010-01-14 22:09:21