Учитывая стилизованный WPF DependencyObject, как я могу получить ключ стиля в коде?

У меня есть набор элементов управления, привязанных к данным, для которых я хотел бы программно добавить валидаторы к привязкам. В настоящее время я могу перебирать визуальное дерево, чтобы найти эти элементы управления с привязками, а также добавлять свои средства проверки к этим элементам управления. Но чтобы дополнительно указать, какие элементы управления должны иметь конкретную проверку, я хотел использовать стили. Итак, мой XAML выглядит так:

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

Здесь стиль optionalNumericTextBox служит как для добавления шаблона ошибки проверки, так и в качестве декоратора, указывающего, что к этому текстовому полю должен быть применен необязательный числовой валидатор.

Проблема возникает, когда я просматриваю визуальное дерево, обнаруживаю элемент управления с привязками, а затем мне нужно определить используемый стиль. В настоящее время я пробовал

dependencyObject.GetValue(FrameworkElement.StyleProperty)

который дает мне объект Style, но насколько Я могу сказать, что этот объект не имеет значения «OptionalNumericTextBox». Можно ли вообще определить ключ или эта информация теряется в читателе XAML?


person Peter Lillevold    schedule 02.11.2009    source источник


Ответы (1)


При использовании 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.

person Kent Boogaart    schedule 02.11.2009
comment
Отличный совет, используя установщик свойств. На самом деле указал мне на использование прикрепленного свойства вместо тега. Так что теперь я использую что-то вроде: ‹Setter Property=ViewValidator.ValidationStyle Value=OptionalNumeric /› Работает как шарм! - person Peter Lillevold; 02.11.2009