Как получить стилевой ключ в коде, учитывая стилизованный WPF DependencyObject? - PullRequest
6 голосов
/ 02 ноября 2009

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

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

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

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

dependencyObject.GetValue(FrameworkElement.StyleProperty)

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

1 Ответ

5 голосов
/ 02 ноября 2009

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

...