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

时间:2009-11-02 10:59:40

标签: wpf styles dependencyobject

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

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

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

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

dependencyObject.GetValue(FrameworkElement.StyleProperty)

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

1 个答案:

答案 0 :(得分: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属性。