如何强制WPF重新验证控件?

时间:2011-03-24 08:42:59

标签: wpf idataerrorinfo

我有一个包含业务规则的屏幕,该屏幕根据业务数据显示某些字段,而不显示其他字段。然后我玩Visibility来显示/隐藏它们。

我的业务对象实现了IDataErrorInfo。

我遇到的问题是,某些验证仅在显示字段时才适用。

在此代码提取中,第一个IF仅在type_account为INTERNAL

时才进行验证
string ValidateMinimumAmount()
{

    if (this.type_account != "INTERNAL")
       return null;

    if (this.account_minimum==null)
    {
        return "You must provide a minimum amount";
    }
    return null;
}

我遇到的问题是,由于我的BO的初始状态不是“内部”,所以即使在用户选择“内部”后,验证也不会再次发生。

我怎样才能“强制”在第一次之后进行验证。 当然我已经检查过,如果初始状态是“内部”,那么它可以正常工作

3 个答案:

答案 0 :(得分:1)

我建议您通过添加错误属性来更“正确”地通知错误。

这是一篇非常容易理解的文章,对我有帮助,当我刚刚开始在WPF作为一个完整的初学者工作时,你应该看看这个:

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

答案 1 :(得分:1)

你说当你玩捉迷藏时,你的“验证”会消失吗?但是再次显示后,IDataErrorInfo实现的对象仍无效?

然后它似乎只是一个ValidationErrorTemplate Adorner问题。我不知道您的xaml是什么样的,但是用您的控件包围您的容器以使用AdornerDecorator进行验证

<AdornerDecorator>
  <Yourcontainer with your Controls inside/>
</AdornerDecorator>

如果这个技巧不能解决你的xaml绑定和idataerrorinfo实现的问题。

答案 2 :(得分:0)

你的问题有点令人困惑。希望这个答案会有所帮助。

在您的示例中,如果帐户类型是内部帐户,则需要最低金额。这意味着MinimumAmount属性的验证状态取决于AccountType的值。因此,只要MinimumAmount发生更改,您就必须验证AccountType。因此:

public string AccountType
{
   get { return _AccountType; }
   set
   {
      if (_AccountType != value)
      {
         _AccountType = value;
         OnPropertyChanged("AccountType");
         ValidateMinimumAmount();
      }
   }
}

如果属性之间有很多相互依赖关系,有时最简单的方法就是为整个对象实现一个Validate()方法,并在任何属性发生变化时调用它。不要因为在财产发生变化时重新验证整个对象效率低下的想法而感到困惑。查看模型属性通常只会根据用户输入进行更改,除非您的Validate()方法需要花费大量时间才能运行,否则可能性非常小。