BindingExpression.ValidateWithoutUpdate()の呼び出しが、実際にアドバタイズすることを行わない理由を理解しようとしています。
添付プロパティを介して(たとえば、コードから)バインディングに追加する必要があるいくつかの気難しい検証があります(サンプルコードから退屈な詳細を削除しました。WF4ModelItemの制限に関係していると言えば十分です)。 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を呼び出してみました。 これはうまくいかなかったようです。後で、ディスパッチャーを使用して、アプリケーションがすべて暖かく居心地の良いものになるまで、この呼び出しを延期しました(お茶がまだ醸造を終えていないため、検証されなかった可能性があります、地獄私は知りません)
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が機能することはありません。