我试图理解为什么对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();
}
它永远不会起作用。