3

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が機能することはありません。

BindingExpression.ValidateWithoutUpdate()をfriggen検証するために何をする必要がありますか?!?!

4

1 に答える 1

1

うーん、なんか挙動不審だな。ILSpy でいくつかの検証コードを見ると、検証が必要かどうかを判断するチェックがバックグラウンドで行われています。

これは私が試した最初のことです:

添付プロパティの変更されたハンドラーで、その後

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

追加

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

これは何らかの方法で内部の「検証が必要」フラグを設定し、検証を強制する必要があります。

于 2012-06-22T00:17:38.627 に答える