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