我试图理解为什么对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工作。
答案 0 :(得分:1)
这是我尝试过的第一件事:
在您的附加属性更改处理程序后,
binding.ValidationRules.Add(new MyDerpyValidatonRule());
添加
BindingOperations.ClearBinding(d, prop);
BindingOperations.SetBinding(d, prop, binding);
这必须以某种方式设置内部'validation requred'标志,强制它进行验证。