我有一组绑定到数据的控件,我想在程序上为绑定添加验证器。目前,我能够遍历可视树以找到带有绑定的控件,并将我的验证器添加到这些控件中。但是为了进一步指定哪些控件应该具有特定的验证,我想使用样式。所以我的XAML看起来像这样:
<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" />
此处,optionalNumericTextBox
样式既可以添加验证错误模板,也可以作为装饰器来指示此文本框应该应用可选的数字验证器。
当我遍历可视树,发现带有绑定的控件,然后需要确定使用的样式时,会出现问题。目前我已经尝试了
dependencyObject.GetValue(FrameworkElement.StyleProperty)
它给了我a Style个对象,但据我所知,这个对象没有携带 'optionalNumericTextBox'值。甚至可以确定密钥,还是在XAML阅读器中丢失了这些信息?
答案 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
属性。