我试图理解为什么对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}" />

绑定看起来不错,可以在更改值后使用,但是第一次显示时,我会皱眉而不是预期的红色边框:

最初,我在将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验证?!?!

最佳答案

哇,这是一些奇怪的行为。使用ILSpy查看一些验证代码,它在后台进行了一些检查来确定是否需要验证,而且我很害怕不能一直进行验证,因此,我也只是尝试了一些随机的东西。

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

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

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




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


这必须以某种方式设置内部“需要验证”标志,以强制其进行验证。

关于wpf - ValidateWithoutUpdate永远不会执行配置的ValidationRules吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11147680/

10-11 11:10