ValidateWithoutUpdate是否永远不会执行配置的ValidationRules?

时间:2012-06-21 22:24:01

标签: wpf validation binding idataerrorinfo validationrule

我试图理解为什么对BindingExpression.ValidateWithoutUpdate()的调用实际上并没有做出它所宣传的内容。

我有一些胡思乱想的验证(我从我的示例代码中删除了无聊的细节;足以说它与WF4 ModelItem限制有关),我必须通过附加属性添加到绑定(例如,从代码而不是在xaml)。

    // d is DependencyObject and prop is DependencyProperty
    var binding = BindingOperations.GetBinding(d, prop);
    binding.ValidationRules.Add(new MyDerpyValidatonRule());

这里没什么好疯狂的。但问题是第一次显示控件时不会运行验证,因此UI中不会显示验证错误。

<TextBox
    Grid.Column="1"
    x:Name="derp"
    Text="{Binding Derp, NotifyOnValidationError=True, 
                         ValidatesOnDataErrors=True}"
    t:MyDerpyValidator.TargetProperty="{x:Static TextBox.TextProperty}" />

绑定看起来很好,在值更改后工作,但是当第一次显示时,我得到一个皱眉而不是预期的红色边框:

enter image description here

最初,我在将ValidationRule添加到Binding之后尝试调用ValidateWithoutUpdate 这似乎不起作用。后来,我使用Dispatcher尝试关闭这个调用,直到应用程序温暖舒适(也许它没有验证,因为茶还没有完成酿造,但我不知道)

var exp = BindingOperations.GetBindingExpression(d, prop);
Dispatcher.CurrentDispatcher.BeginInvoke(
    (Action<BindingExpression>)(x =>
    {
        x.ValidateWithoutUpdate();
    }),
    DispatcherPriority.ApplicationIdle,
    exp);

我很确定这种方法有效。的一旦即可。从未再次工作过。我的观察可能不正确。

后来,我尝试了各种各样的事情来 ValidateWithoutUpdate 来实际 做某事 。我甚至尝试在事件处理程序中调用它,这将在未来发生

public DerpyControl()
{
    InitializeComponent();
    derp.MouseEnter += DERPDAMNYOU;
}

void DERPDAMNYOU(object sender, MouseEventArgs e)
{
    derp.GetBindingExpression(TextBox.TextProperty).ValidateWithoutUpdate();
}

从来没有friggen工作。

我需要做些什么才能让BindingExpression.ValidateWithoutUpdate()进行friggen验证?!?!

1 个答案:

答案 0 :(得分:1)

哇,这是一些奇怪的行为。使用ILSpy查看一些验证代码,它在后台进行了一些检查,确定是否需要验证,而且我太害怕无法完全遵循它,所以,我也尝试了一些随机的东西。 / p>

这是我尝试过的第一件事:

在您的附加属性更改处理程序后,

binding.ValidationRules.Add(new MyDerpyValidatonRule()); 

添加

BindingOperations.ClearBinding(d, prop);
BindingOperations.SetBinding(d, prop, binding);

这必须以某种方式设置内部'validation requred'标志,强制它进行验证。