【问题标题】:WPF validation question : how to work with validation which involves 2 fieldsWPF 验证问题:如何使用涉及 2 个字段的验证
【发布时间】:2011-09-16 02:00:07
【问题描述】:

我在屏幕上有 2 个文本框,一个是“从金额”,另一个是“到金额”。验证规则是 'from amount' 应该小于 'to amount'。

现在我的问题是,当用户输入一对“从金额”大于“到金额”的金额时, 如何使两个文本框都显示为红色边框。当用户更正金额时(无论是 通过减少 'from amount' 或增加 'to amount' ,如何使两个文本框都显示 出现错误?

谢谢

我的代码如下所示:

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


}

}

【问题讨论】:

标签: wpf validation binding


【解决方案1】:

当我验证一个依赖于另一个文本框的值的文本框时,而不是像您提到的那样突出显示我拦截值更改并接受或拒绝更改。

我发现,如果我尝试根据对文本框 A 的更改来更改文本框 B,我总是会遇到问题,但如果我根据文本框 B 中的值接受或拒绝对文本框 A 的更改,则效果很好。

编辑:

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

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

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

这样,您就有了稳定的验证,并且用户非常清楚如何更改这些值以及为什么它们不能超出某些限制。

【讨论】:

  • 感谢 Eric 的回答。我的客户想要一个更宽容的选项,以便她可以调整 from_amt 和 to_amt。继续使用 WPF 提供的验证架构会很好。
  • 在上面的评论中添加了更多内容。
【解决方案2】:

查看一个类似的 SO question 及其接受的答案。基本上,一种解决方案可能是从每个属性的设置器中为两个属性发出属性更改通知,以便在任何一个更改时都重新验证它们。

Validate control manually in WPF

【讨论】:

  • 我试图在 OnPropertyChange 处理程序中引发属性更改通知:当更改的字段为 "from_amt",raise "to_amt" 时,这有点工作。但是,当我在更改“to_amt”时再添加一段代码以引发“from_amt”时,出现堆栈溢出异常。
  • 显示from_amtto_amtset 访问器的代码,并显示异常的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多