6

データにバインドされた一連のコントロールがあり、プログラムでバリデーターをバインディングに追加したいと考えています。現在、ビジュアル ツリーを繰り返し処理してバインディングを含むコントロールを見つけ、これらのコントロールにバリデーターを追加することができます。しかし、特定の検証が必要なコントロールをさらに指定するために、スタイルを使用したいと考えました。したがって、私の XAML は次のようになります。

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" />

ここで、optionalNumericTextBoxスタイルは検証エラー テンプレートの追加と、このテキスト ボックスにオプションの数値バリデータを適用する必要があることを示すデコレータの両方として機能します。

この問題は、ビジュアル ツリーをたどり、バインディングを含むコントロールを発見し、使用中のスタイルを特定する必要があるときに発生します。現在、私は試しました

dependencyObject.GetValue(FrameworkElement.StyleProperty)

これによりStyleオブジェクトが得られますが、私が知る限り、このオブジェクトには「optionalNumericTextBox」値が含まれていません。キーを特定することさえ可能ですか、それともこの情報は XAML リーダーで失われますか?

4

1 に答える 1

5

を使用StaticResourceExtensionすると、XAML を BAML に変換するコンパイル時にこの情報が失われます。DynamicResourceExtension一方、を使用すると、実行時にリソースを解決できるようにキーが保持されます。キーを取得するには、次を使用する必要がありますReadLocalValue()

//this gets the Style
var s = textbox.GetValue(TextBox.StyleProperty);
//this gets a ResourceReferenceExpression
var l = textbox.ReadLocalValue(TextBox.StyleProperty);

問題はResourceReferenceExpression、内部型であるため、リフレクションを使用してキーを引き出す必要があることです。

Tagこれらすべての代わりに、代わりに財産を乗っ取ることを検討しましたか?

<Style x:Key="optionalNumericTextBox" TargetType="TextBox">
    <Setter Property="Tag" Value="optionalNumericTextBox"/>
</Style>

次に、コードで のTagプロパティを簡単に確認できますTextBox

于 2009-11-02T11:58:04.093 に答える