给定一个样式化的WPF DependencyObject,如何在代码中获取样式键?

Pet*_*old 6 wpf styles dependencyobject

我有一组绑定到数据的控件,我想在程序上为绑定添加验证器.目前,我能够遍历可视树以找到带有绑定的控件,并将我的验证器添加到这些控件中.但是为了进一步指定哪些控件应该具有特定的验证,我想使用样式.所以我的XAML看起来像这样:

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" />
Run Code Online (Sandbox Code Playgroud)

这里,optionalNumericTextBox样式既可以添加验证错误模板,也可以作为装饰器来指示此文本框应该应用可选的数字验证器.

当我遍历可视树,发现带有绑定的控件,然后需要确定使用的样式时,会出现问题.目前我已经尝试过了

dependencyObject.GetValue(FrameworkElement.StyleProperty)
Run Code Online (Sandbox Code Playgroud)

这给了我一个Style对象,但据我所知,这个对象没有携带'optionalNumericTextBox'值.甚至可以确定密钥,还是XAML阅读器中丢失了这些信息?

Ken*_*art 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);
Run Code Online (Sandbox Code Playgroud)

问题是,ResourceReferenceExpression是内部类型,因此您需要使用反射来拉出密钥.

作为这一切的替代方案,您是否考虑过劫持该Tag物业?

<Style x:Key="optionalNumericTextBox" TargetType="TextBox">
    <Setter Property="Tag" Value="optionalNumericTextBox"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

然后你的代码可以简单地检查Tag属性TextBox.