代码之家  ›  专栏  ›  技术社区  ›  Peter Lillevold Rene

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

  •  6
  • Peter Lillevold Rene  · 技术社区  · 15 年前

    我有一组绑定到数据的控件,我希望在这些控件上以编程方式向绑定添加验证程序。目前,我可以在可视化树上迭代,以找到那些带有绑定的控件,并向这些控件添加我的验证器。但为了进一步指定哪些控件应该具有特定的验证,我希望使用样式。所以我的XAML如下:

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

    这里, optionalNumericTextBox Style既可以添加验证错误模板,也可以作为修饰符,指示此文本框应应用可选的数字验证程序。

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

    dependencyObject.GetValue(FrameworkElement.StyleProperty)
    

    给我 a Style 但据我所知,这个物体不携带 “OptionalNumericTextBox”值。是否甚至可以确定密钥,或者该信息是否在XAML读取器中丢失?

    1 回复  |  直到 13 年前
        1
  •  5
  •   Tim Cooper    13 年前

    使用时 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>
    

    然后您的代码可以简单地检查 标签 属性上 TextBox .