0

次のバインディングがある場合

<TextBox Text="{Binding XXX.Name, ValidatesOnNotifyDataErrors=True}"/>

DataContext のみが INotifyDataErrorInfo を実装し、「XXX.Name」エラーを発生させますが、ValidatesOnNotifyDataErrorsはデータ コンテキストではなくエラー イベントを監視しようとするため、機能しません。XXX

ただし、添付プロパティを記述して次のことを行う方法を誰かが理解できると確信しています

<TextBox Grid.Column="5" Text="{Binding Binding.Name, c:ValidatesOnNotifyDataErrorsOnDataContext=True}"/>

子ではなく、データ コンテキストが監視される場所。誰もそれから始める方法を考えましたか?

4

1 に答える 1

1

これを実装することは可能だと思いますが、バインディング (RelativeSource、MultiBindings など) の柔軟性のために、このような真に堅牢なものを作成することは困難です。個人的には、構造のすべてのレベルで INotifyDataErrorInfo を実装する方がきれいだと思います (また、所有していない構造の部分については、Point例のように、プロパティをミラーリングするプロキシ クラスを使用します)。

とにかく、BindingDependencyObject ではなく MarkupExtension です。つまり、添付プロパティを適用することはできません。継承Bindingして独自のプロパティを追加することもできますが、オーバーライド可能なメソッドが提供されないため、これはあまり役に立ちません。

ただし、必要なのはカスタムValidationRuleだけなので、Binding を拡張する必要はありません。設定はNotifyDataErrorValidationRuleValidatesOnNotifyDataErrors=Trueを追加するのと同じです:

<TextBox>
    <TextBox.Text>
        <Binding Path="XXX.Name">
            <Binding.ValidationRules>
                <NotifyDataErrorValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox>
</TextBox>

NotifyDataErrorValidationRuleしたがって、独自のルールに置き換えるだけです。この Validate オーバーロード(バインディング式が渡される)をオーバーライドすると、(ParentBinding を介して) 完全なバインディング パスにアクセスし、エラーを検索できるようになります。

于 2013-10-16T13:18:07.593 に答える